Makefile:常用知识点总结

本文详细介绍了Makefile的基本概念,包括规则、GCC与make自动推理、makefile内容结构、命令书写与执行、错误处理、变量使用、环境变量、模式变量、条件判断及函数应用。通过实例演示如何使用Makefile控制项目构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


https://download.csdn.net/download/Shawn_Ch/12250282

0 makefile

Makefile是控制“ make”命令的文件。 Make在几乎每个平台上都可用,并用于控制项目的构建过程。 为项目编写Makefile之后,make可以轻松高效地构建项目并创建所需的输出文件。

0.1 规则

在这里插入图片描述
prerequisites中如果有一个以上的文件比target要新的话,command所定义的命令就会被执行。这个就是makefile中最核心的内容。

0.2 GCC&make自动推理

gcc [option] filename
在这里插入图片描述可以直接输入文件来输出可执行文件,其中命令必须要用tab开头
在这里插入图片描述
当然也可以不输入.c文件,只要输入.o文件那么make就可以推理到.c文件。
在这里插入图片描述

0.3 makefile内容

显式规则
隐晦规则
变量定义:makefile中的变量有点像c语言中的宏,做了一个替换。
文件指示:引用别的makefile。格式为 include
注释

1 书写命令

1.1 显示命令

@echo

1.2 命令执行

如果需要两条指令连续执行,那么他们之间用分号隔开。
cd ./tools ;pwd

1.3 命令出错

执行过程中有可能出错,出错的话就会停止执行,所以需要在命令前加上“-”表示不管执行成功与否都继续执行。

2 变量

2.1 变量使用

变量的基础

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。
makefile中“=”、“:=”、“+=”的区别。
https://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html

=
是把整个makefile都执行完之后的赋值
:=
覆盖之前的值
+=
两边的值相加,再赋值

?=

?= &esmp;//表示模块如果没有被定义的话,就定义。
JOB ?= $(job)//大小写通用。
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上 $ 符号,但最好用小括号 () 或是大括号 {} 把变量给包括起来。如果你要使用真实的 $ 字符,那么你需要用 $$ 来表示。

override

如果定义了变量不想让Make命令行改变,可以在前面加override

OBJS = hello.c
override value1 = "this is a this is a test of override"
main: 
        @echo "start gcc"
        gcc -o hello ${OBJS}
        @echo ${value1}
.PHONE: clean

clean:
        rm hello.o

执行

make value1=hello

此时value1的值不会改变。

多行变量

define two-lines

endif

这个功能可以定义一系列的函数变量等。

2.2 环境变量

  Make 运行时的系统环境变量可以在 make 开始运行时被载入到 Makefile 文件中,但是如果 Makefile 中已定义了这个变量,或是这个变量由 make 命令行带入,那么系统的环境变量的值将被覆盖。(如果 make 指定了“-e”参数,那么,系统环境变量将覆盖 Makefile中定义的变量)。
  很像“全局变量”和“局部变量”的特性。
  MAKECMDGOALS:在命令行中指定Target,不指定则为空。

2.3模式变量

3 条件判断

3.1 ifeq

让make在运行时选择不同的分支。

value2 = "1"
value3 = "1"
ifeq "${value3}" "${value2}"
main:  hello.o
        @echo "start gcc"
        gcc -o hello ${OBJS}
        @echo ${value1}
endif

如果两值相等,那么才会执行。

3.2 ifdef

4 函数

4.1 字符串处理函数

subset

功能:进行字符串替代。
使用方法: $(subset from , to ,string)

patsubset

功能:进行模式字符串的替换,类似通配符的方法。

strip

去掉空格。strip为脱掉之意。
ifeq ($strip $(HELLO)),TRUE)
如果定义了HELLO = TRUE那么,以上函数由上一个makefile传递过来。

findstring

功能:查找字符串函数。$(find a ,a b c)//在abc中查找a。

filter

功能:过滤函数

filter-out

功能:反过滤函数,输出的是不符合要找的pattern的字符串。

sort

功能:给字符串中的单词,按照单词的升序进行排序。

3.2 文件名处理函数

3.3 foreach

功能:从名字就可以看出,这是一个循环函数,类似C中的for。
示例:names := a b c d
   files := $(foreach n, $(names), $ (n).o)

//把names中的每一个放入n中。然后再执行后面的$(n).o

3.4 origin

功能:origin,起源。这个函数返回变量的起源信息。

3.5 if

功能:判断函数。
示例: $(if condition, do,else do).

4 Make的运行

待补充。

实例

make project=项目名称 new job=4 -j4

其中 除了前面加-的是make自己的命令,其他的都是变量, p=“项目名称"意思是给p这个变量赋值为"项目名称”,然后在mk中就可以进行按照工程名字进行执行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值