提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
makefile项目管理工具
命名:makefile Makefile --- make 命令
作用:
1.项目编译管理
2.提高编译效率
3.降低编译出错概率
工作原理:
1.欲生成目标,检查规则中依赖条件是否存在。不存在寻找新规则来生成该依赖
2.欲更新目标,须先检查其所有依赖。依赖中有任一个被更新,则目标必须更新
一、makefile基础规则:
目标:依赖条件
(tab)命令
如:add.o:add.c
gcc –Wall –g –c add.c –o add.o
1.目标的时间必须晚于依赖条件的时间,否则,更新目标
2.依赖条件如果不存在,找寻新的规则去产生依赖条件。
ALL:指定makefile的终极目标。
二、makefile两个函数和clean:
src = $(wil1dcard . *.c)
匹配当前工作目录下的所有.c文件。将文件名组成列表,赋值给变量src。假如该目录下有add.c sub.c div.c这几个.c文件,那么src = add.c sub.c div.c。
obj = $(patsubst %.c,%.o,$(src))
将参数3中,包含参数1的部分,替换为参数2。obj = add.o sub.o div1.o
c1ean:(没有依赖)
-rm -rf $(obj) a.out
rm前面的“-”作用是删除不存在文件时不报错,顺序执行结束。
假如待删除文件集合是5个,已经手动删除了1个,就只剩下4个,然而删除命令里面还是5个的集合,就会有删除不存在文件的问题,不加这-,就会报错,告诉你有一个文件找不到。加了-就不会因为这个报错。
三、makefile变量、3个自动变量、模式规则:
变量定义及使用:
foo=abc #变量定义直接用'=',’=‘两边不能有空格
bar=$(foo) #使用变量值用$(变量名)
3个自动变量
$@:在规则的命令中,表示规则中的目标。
$<:在规则的命令中,表示第一个依赖条件,如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则。
$^:在规则的命令中,表示所有依赖条件,组成一个列表,以空格隔开,如果这个列表中有重复项,则去重。
模式规则:
模式规则是一种通用的规则,可以匹配多个文件。它的语法为:
%.o:%.c
gcc -c $< -o $@
它告诉make工具如何将所有以.c为扩展名的源文件编译成以.o为扩展名的目标文件。
%.o: %.c 表示所有以.c为扩展名的文件(比如a.c、b.c、c.c等)对应的目标文件是以.o为扩展名的文件(a.o、b.o、c.o等)。
gcc -c $< -o $@ 表示了生成目标文件的命令。其中,<表示依赖文件列表中的第一个文件(即.c文件),@ 表示目标文件(即.o文件)。这个命令告诉make工具使用gcc编译器将.c文件编译成.o文件。
注意:只有写成模式规则的时候,$<才表示了所有依赖条件的依次取值,否则只是取依赖条件中的第一个。
静态模式规则:
静态模式规则是一种更加特定的规则,可以匹配指定的文件列表。它的语法为:
$(obj):%.o:%.c
gcc -c $<-o %@
静态模式规则是用来指定该模式规则是用来生成某一个obj的,也就是指定模式规则给谁用,以后文件多了,文件集合会有很多个,就需要指定哪个文件集合用什么规则。
伪目标:
.PHONY : clean ALL
声明伪目标clean和ALL。why?
当前文件夹下有ALL文件或者clean文件时,会导致makefile瘫痪,用伪目标来解决,添加一行 .PHONY: clean ALL
如下图所示:
再来执行make clean,就不会受到干扰了。
还有一个扩展就是,编译时的参数,-g,-Wall这些,可以放在makefile里面
修改后makefile如下:
总结:
模式规则:%.o:%.c
’%‘表示一个或多个,在依赖条件中同样可以使用’%‘,依赖条件中的’%’的取值,取决于其目标。
自动变量:gcc -c $< -o $@
只有写成模式规则的时候,$<才表示了所有依赖条件的依次取值,否则只是取依赖条件中的第一个。
add.o:add.c
gcc -c $< -o $@
sub.o: sub.c
gcc -c $< -o $@
sub,add这些指令中使用$<和$^都能达到效果,但是为了模式规则,所以使用的$<
修改一下就成为了:
%.o:%.c
gcc -c $< -o $@