1 引言
在阅读Makefile时经常会碰到一些“奇怪的符号”,比如?=、:= 、+=
;还有$@,$<,$^
等; 之前也都看过了解,但是时间一长,回过头来看就又忘记了,这里做个简单的记录,方便同样遇到困惑的同学查询。
1 四种常用等式(= := += ?=)
1.1 四种等式的作用
序号 |
等式 |
作用说明 |
1 |
= |
延时变量,即make会将整个makefile展开后,再决定变量的值 |
2 |
:= |
立即变量,即在定义时它的值就已经确定了 |
3 |
?= |
如果没有被赋值过就赋予等号后面的值; 有赋值过,则还是原来的值 |
4 |
+= |
在原先已赋值的内容后,再追加等号后面的值进去 |
1.2 举例说明:
#---------------------1、“=”
#在shell执行make后会将整个makefile展开后,再决定变量的值。即延时变量,
#也就是说,变量的值将会是整个makefile中最后被指定的值。
#看例子:
x = foo
y = $(x) bar
x = xyz
#在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
#---------------------2、“:=”
#“:=”表示变量的值决定于它在makefile中的位置,
#而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
#在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
#---------------------3、“?=”
## ?=的作用上述代码的意思就是,如果变量 name 前面没有被赋值,
##那么此变量就是“abc222”,
##如果前面已经赋过值了,那么就使用前面赋的值
name = abc111
name ?= abc222
print:
@echo name:$(name)
#输出的结果为: name:abc111
#---------------------4、“+=”
##知识点① +=的作用给前面已经定义好的变量添加一些字符串进去
OBJECT :=main.o add.o
OBJECT +=dec.o
@echo OBJECT:$(OBJECT)
#在上例中,OBJECT的值将会是OBJECT:main.o add.o dec.o
2 自动化变量符号$X
2.1 自动化变量符号$X说明
- Makefile常用的为3个: $@ 、 $^ 和 $< ,,作用如下;
- 其他用到的$X符号,作用如下:
2.2 $X实例说明
objects = main.o add.o dec.o
main: $(objects) ##这里下面用$@表示目标main
gcc -o $@ $(objects)
%.o : %.c ##这里下面用$^和$<效果一样,因为如果依赖文件是以模式(即“%” )定义的,那么“$<”就是符合模式的一系列的文件集合
gcc -c $^
clean:
rm *.o
rm main
3 其他Makefile常用语法
除了以上2点,在Makefile阅读中还会遇到其他的“奇怪点”,比如通配符: %、*、?
; 比如常用选项:-f
、-C
、M=
、-D
;比如常用函数:foreach
、wildcard
、patsubst
、subst
等,本人整理一篇Makefile常用知识点.pdf
,由于篇幅有限,有兴趣的同学可-关.注-我的同名_公-众.号“慢慢Coding”,回复Makefile即可;