makefile note
通配符*:目录下所有文件
通配符%:依赖查找中的通配
$@:表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
$^:所有的依赖目标。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
$<:第一个依赖目标。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$?:所有更新过的依赖目标的集合,以空格分隔。
@:不回显命令
-:忽略错误
.PHONY:伪目标,非文件,一般位于makefile文件首行,同时也是make的默认目标
include:加载文件,未找到则告警信息,并在完成makefile的读取后重试
$(basename 文件名):取得去掉后缀的文件的名字
$(sources:.c=.d):把变量$(sources)所有[.c]的字串都替换成[.d]
自动生成头文件依赖
if a file (1) appears as a target in a rule with no prerequisites and no commands, and (2) that file does not exist and cannot be remade, then make will rebuild anything which depends on that file and not report an error.
%.d : %.c
@set -e; \
gcc -MM $@ > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
-include seq.d
Makefile对头文件的处理:
- seq.d内容类似于“seq.o seq.d: seq.h seq.c”,.h文件内容更新时,.d文件会重新生成并重新include
- .h文件名更改时,可使得seq.d内容类似于以下(采用上述英文所述方法完成seq.d的自动更新)
seq.o seq.d: seq.h seq.c
seq.h:
seq.c:
make定位error
make 2>&1 | grep error
诸神对凡人心生艳羡,厌倦天堂。