标签:
在执行make之前需要一个命名为Makefile的特殊文件来告诉make需要做些什么。
当使用 make 工具进行编译时,工程中以下几种文件在执行 make 时将会被编译 (重新编译):
1. 所有的源文件没有被编译过,则对各个 C 源文件进行编译并进行链接,生成最后的可执行程序;
2. 每一个在上次执行 make 之后修改过的 C 源代码文件在本次执行 make 时将会被重新编译;
3. 头文件在上一次执行 make 之后被修改。则所有包含此头文件的 C 源文件在本次执行 make 时将会被重新编译。
后两种情况是make只将修改过的C源文件重新编译生成.o文件,对于没有修改的文件不进行任何工作。
一个简单的Makefile描述规则组成:
TARGET : PREREQUISITES
COMMAND
...
...
TARGET: 规则的目标。通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。
PREREQUISITES:规则的依赖。生成规则目标所需要的文件名列表。通常一个目标依赖于一个或多个文件。
command: 规则的命令行。以[tab]键开头。直接交给系统的shell执行。
换行是以( \ )来分解的。
默认情况下,Makefile中的第一个规则为最终目标或终极目标。
对于.o文件作为目标的规则处理有下列三种情况:
1. 目标.o 文件不存在,使用其描述规则创建它;
2. 目标.o 文件存在,目标.o 文件所依赖的.c 源文件、.h 文件中的任何一个比目标.o文件“更新”(在上一次 make 之后被修改)。则根据规则重新编译生成它;
3. 目标.o 文件存在,目标.o 文件比它的任何一个依赖文件(的.c 源文件、 .h 文件)“更新”(它的依赖文件在上一次 make 之后没有被修改),则什么也不做。
对于终极目标,其处理方式和.o文件类似。
由于规则的目标和依赖通常有比较多的文件,我们可以用变量进行定义,来方便我们修改。
objects = main.o
$(objects) //这样来使用变量
在使用make编译.c源文件时,编译.c源文件的规则命令可以不用明确给出。
这是因为make本身有一个默认规则,能够自动完成对.c文件的编译并产生对应的.o文件。
它执行命令“cc -c”来编译。
书写规则建议的方式是:单目标,多依赖。就是说尽量要做到一个规则中只存在一个目标文件,可有多个依赖文件。 尽量避免使用多目标,单依赖的方式。
.PHONY:clean
clean:
-rm *.o
这两个实现和普通的有两点不同:
1. 通过“ .PHONY”特殊目标将“ clean”目标声明为伪目标。避免当磁盘上存在一个名为“ clean”文件时,目标“ clean”所在规则的命令无法执行。
2. 在命令行之前使用“ -”,意思是忽略命令“ rm”的执行错误。
这样的一个目标不能将其作为终极目标。
clean可以作为终极目标的依赖。
标签:
原文地址:http://www.cnblogs.com/ynxf/p/5954244.html