程序的编译过程
Makefile的作用
Makefile文件用于告诉make命令,如何去编译和链接程序生成可执行文件,Makefile中写的是程序编译时所遵从的一些规则。
Makefile的书写规则
<target> : <prerequisites>
[tab] <commands>
target: 目标文件
prerequisite: 依赖文件
commands: make要执行的命令
注: tab键不能缺少
由上可知,Makefile的规则就是target文件依赖于prerequisite文件,其生成的规则定义在command中。当prerequisite中的文件有变化时,由用户调用make命令执行command中的命令。
Makefile五个规则
- 显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
- 隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
- 变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
- 文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。
- 注释。Makefile中只有行注释,和LUNIX的Shell脚本一样,其注释是用"#“字符,这个就像C/C++中的”//“一样。如果你要在你的Makefile中使用”#“字符,可以用反斜框进行转义,如:”#"。
make的工作原理
在终端执行make命令时
- make会在当前目录查找名字叫做"Makefile" 或 “makefile” 的文件
- 如果找到,它会找到Makefile文件中的第一个目标文件,并且将这个目标文件作为最终的目标文件
- 如果这个文件不存在,或者依赖文件的时间戳比目标文件的时间戳要新,那么它就会去执行command命令来生成目标文件
- 如果目标文件的依赖文件也不存在,那么他就会去找依赖文件的依赖文件,并且根据规则生成依赖文件的依赖文件
- 最后再根据.c源码文件和.h头文件生成.o中间文件,最后再生成可执行文件
make的工作方式
- 读入所有的Makefile
- 读入被include的其他Makefile
- 初始化文件中的变量
- 推导隐晦规则,并分析所有规则
- 为所有的目标文件创建依赖关系链
- 根据依赖关系,决定那些目标要重新生成
- 执行生成命令