[make是什么?]
make是一个命令工具,是一个解释makefile中指令的命令工具。它可以简化编译过程里面所下达的指令,当执行 make 时,make 会在当前的目录下搜寻 Makefile (or makefile) 这个文本文件,执行对应的操作。make 会自动的判别原始码是否经过变动了,而自动更新执行档。
[为什么要使用make?]
假设,现在一个项目里面包含了100个程序文件,如果要对这个项目进行编译,那么光是编译指令就有100条。如果要重新进行编译,那么就又得像之前一样重新来一遍。这样重复且繁琐的工作实在是让我们很不爽啊。所以,用make来进行操作,间接调用gcc岂不是很方便?如果我们更动过某些原始码档案,则 make 也可以主动的判断哪一个原始码与相关的目标文件档案有更新过, 并仅更新该档案。这样可以减少重新编译所需要的时间,也会更加方便。
[makefile又是干什么的?]
makefile其实就是一个文档,里面定义了一系列的规则指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,它记录了原始码如何编译的详细信息! makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
[定义]
Makefile文件由一系列规则(rules)构成。每条规则的形式如下。
<target> : <prerequisites>
[tab] <commands>
上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须由一个tab键起首,后面跟着"命令"(commands)。
目标:
一个目标就构成一条规则。目标通常是文件名,指明make命令要构建的对象,目标可以是一个文件名,也可以是多个文件名。之间用空格分隔。
除了文件名,目标还可以是某个操作的名字(如:clean),这称为是“伪目标”(phony target)
前置条件:
前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。
命令:
命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。
当你写下一个规则的时候,例如:
unit: output.o test2.o
gcc -o unit output.o test2.o
就是说,让编译器以(output.o test2.o)为前置条件,使用gcc编译器对这两个目标文件进行链接生成 unit 可执行文件 ,
但是如果(output.o test2.o)这两个文件中有一个不存在,我们可以在makefile文件中再添加两条规则来生成这个文件.
output.o:test2.h output.c gcc -c output.c test2.o:test2.h test2.c gcc -c test2.c
对于两个源文件一个头文件,使用一个完整的makefile文件规定他们之间的编译规则:
unit: output.o test2.o gcc -o unit output.o test2.o output.o:test2.h output.c gcc -c output.c test2.o:test2.h test2.c gcc -c test2.c #删除所有目标文件,并声明clean为伪目标 .PHONY:clean clean: rm *.o
执行结果:
Make 处理makefile文件的过程了解一下?
缺省情况下,make开始于第一个目标,这个目标称为缺省最终目标.如上面的makefile文件中的 unit .
这样,当我们在终端敲下 make 命令的时候,Make 就会读取当前目录下的makefile文件,并开始处理第一条规则,本例中就是链接生成unit可执行文件,
但在make全部完成本规则工作之前,必须先处理 unit 所依靠的OBJ文件,这些OBJ文件被按照自己的规则处理更新,每个OBJ文件的更新规则是编译其源文件.如果源文件都没有改变,则不进行重新编译.
其他规则的处理根据他们的目标和缺省最终目标的依赖关系来判断,如果没有任何关联,则不会被执行.除非告诉make强制执行.如:[make clean]
在OBJ文件被重新编译(如果需要的话)之后,make决定是否重新链接生成unit的可执行文件.任何文件有改变的话,则对有依赖的文件进行编译,并生成新的可执行文件.
参考资料: