make和makefile简明基础
0.make、makefile是什么?
makefile定义了一系列的规则,来规定哪些部分先编译,哪些部分后编译,写好makefile以后,只需一个make命令就可以让整个工程完全自动编译,所以简单的说,make&makefile实现了大工程的自动化编译。
1.makefile里是什么?
看个makefile的简单例子:
1 target:main.o test.o 2 cc -o target main.o teat.o 3 main.o:main.c x.h 4 cc -c main.c 5 test.o:test.c y.h 6 cc -c test.c 7 clean: 8 rm target main.o test.o
可以看出,makefile中主要由两个部分组成:#1文件依赖关系和#2生成所需命令。其中clean是一个伪目标文件,可用".PHONY:clean"在其前面注明。执行make命令即可编译,执行make clean即可删除所有目标文件。
2.make是如何工作的?
0)make会在当前目录下找名字为"makefile "或"Makefile"的文件;
1)若找到makefile文件,接着找第一个目标文件(target),并把它作为最终的目标文件;
2)若target文件依赖后面的.o文件更新,则执行后面定义的命令会生成target文件;
3)某个.o文件也会依赖若干个源文件和头文件,它们根据命令生成.o文件。
根据make的依赖性,make会一层层地去找文件的依赖性,直到最终第一个target文件被编译成功。整个过程类似于数据结构中栈的操作。
3.特别注意——makefile中的变量赋值:
"="是最基本的赋值,makefile会将整个makefile展开后,再决定变量的值。
":="是覆盖当前的值,其取决于当前的赋值,而不是最终的赋值(比较好判断)。
"?="是若没有被赋值过就赋等号后的值。
"+="是添加等号后的值。
4.可以利用变量减少重复,及利用makefile的自动推导简化makefile,例如:
1 #Makefile 2 objects:main.o test.o 3 target:$(objects) 4 cc -o target $(objects) 5 main.o:x.h #这就用到了自动推导。 6 test.o:y.h 7 .PHONY:clean #说明clean是一个伪目标文件。 8 clean: 9 rm target $(objects)
因为这个编译较简单,优势可能不太明显,若要是大工程,变量和自动推导的使用会让makefile有很大的简化。这个部分其实还很丰富,先暂记到这。
5.小注:
0)makefile中命令必须以[tab]键开始。
1)若指定特定的makefile,可用"-f"和"--file"参数。
2)include,被包含的文件会被原封不动的放在当前文件包含的位置,如:
include foo.make
注意,不能以[tab]键开始。
简单记录了自己的笔记,对于错误和疏漏,欢迎赐教指正。关于make和makefile的更多内容,推荐陈皓的《跟我一起写Makefile》和GNU Makefile手册。