Makefile中的%标记和系统通配符*的区别在于,*是应用在系统中的,%是应用在这个Makefile文件中的。
通配符%的意思是:
- 当没有目标test1.o时,我要找test1.o的构造规则,看看Makefile中那个规则符合。
- 然后找到了%.o:%.c,
- 来套一下来套一下:
- %.o 和我要找的 test1.o 匹配
- 套上了,得到%=test1。
- 所以在后面的%.c就表示test1.c了。
- OK进行构造
而通配符*的意思是:
- 我不知道目标的名字,系统该目录下中所有后缀为.c的文件都是我要找的。
- 然后遍历目录的文件,看是否匹配。找出所有匹配的项目。
下面是几个特舒符号的意思:
$@:目标的名字
$^:构造所需文件列表所有所有文件的名字
$<:构造所需文件列表的第一个文件的名字
$?:构造所需文件列表中更新过的文件
例如:
1 test1.o:test1.c
2 gcc -o $@ $<
$@:就是test1.o
$<:就是test1.c
1 test1.o:test1.c head.c 2 gcc -o $@ $^
$^:就是test1.c head.c
$(subst 要被替换的字符串,用来替换的字符串,被处理的字符串):
用“用来替换的字符串”替换“被处理的字符串”中的“要被替换的字符串”
所以:
$(subst .c,.o,test1.c test2.c)
就会得到test1.o test2.o
$(wildcard 寻找的文件):
在系统中寻找文件
例如:
$(wildcard *.c)
就等于找到系统中所有后缀为.c的文件,返回成以空格隔开的一整行字符
例如:test1.c test2.c test3.c 这样
$(basename 文件名):
取得文件的名字(去掉后缀的意思)
例如:
$(basename test1.c)
就会取得test1