Make工具及makefile文件编写简介
概述:
在Linux(unix)环境下使用GNU 的make工具能够比较容易的构建一个属于你自己的工程,整个工程的编译只需要一个命令就可以完成编译、连接以至于最后的执行。make是一个工具,能够自动执行Makefile中的指令,make工具的使用关键在于编写makefile文件。
make命令:
举一个简单的例子来说明make命令执行的过程,在某代码目录下执行make命令,make工具会自动识别当前目录下的GUNmakefile、makefile或者Makefile作为执行文件,或者可以通过命令行指定相应的文件名:make –f NAME 或者 make –file = NAME,NAME即指定的文件名。
Makefile文件:
Makefile文件定义了一系列规则,make工具通过这些规则来构建工程。其主要包括三部分:规则的目标、规则的依赖和规则的命令。以下面的简单makefile文件为例(红色部分是为了方便说明加的行号):
#sample Makefile
edit : demo.o // 1
cc -o edit demo.o // 2
demo.o : demo.c demo.h //3
cc -c demo.c //4
clean : //5
rm edit demo.o //6
该例子中一共有三条规则,第1、2,3、4,5、6行分别是一条完整的规则。蓝色部分是规则的目标,绿色部分为规则的依赖(分为常规依赖和order依赖,这里不展开),黑色部分为规则的命令(make将第一个规则出现后,所有以tab开头的行当做命令处理)。目标就是最终要输出的文件,依赖就是构建目标需要用到的文件,命令则是定义了如何利用依赖去构建目标。make工具将makefile中的第一个目标作为最终目标,也作为开始执行的起点(有点像main函数),然后开始寻找最终目标的依赖,再查找依赖的依赖,递归生成所有依赖后,构建目标。下面图1的例子可以帮助我们更好地理解这个过程:
图1
Make首先将out作为最终目标,然后查找其依赖a.o,就行查找目标为a.o的规则进而查找a.o的依赖,然后调用a.o的命令生成a.o;返回目标out的规则中继续b.o,当a.o与b.o都生成够,调用out的命令cc –o out a.o b.o生成最终目标。
再次编译时,当一个文件被修改,则所有相关文件都会被重新编译,如果没有修改则不做处理。
写在最后:
make还有很多其他功能点,例如include、环境变量、变量、函数、文件查找、查找动态库
查找静态库等,本文只是简单概述,可以在用到时再对应查询。参考资料GUN_make中文版。