2.4 Make工程管理器
1.工程管理器作用
到此为止,读者已经了解了如何在Linux下使用编辑器编写代码,如何使用GCC把代码编译成可执行文件,还学习了如何使用GDB来调试程序,所有的工作看似已经完成了,为什么还需要Make这个工程管理器呢?
Linux中的项目管理器“Make”有些类似于Windows中VC里的“工程”,它是一种控制编译或者重复编译软件的工具,另外,它还能自动管理软件编译的内容、方式和时机,使程序员能够把精力集中在编写代码上而不是在源代码的组织上。
所谓工程管理器,顾名思义,是用于管理较多的文件的。如果有一个由上百个代码文件构成的项目,其中只有一个或少数几个文件进行了修改,按照之前所学的GCC编译工具,就不得不把这所有的文件重新编译一遍,因为编译器并不知道哪些文件是最近更新的,而只知道需要包含这些文件才能把源代码编译成可执行文件,程序员就不得不重新输入数目庞大的文件名以完成最后的编译工作。
编译过程是分为编译、汇编、链接不同阶段的,其中编译阶段仅检查语法错误以及函数与变量的声明是否正确,在链接阶段则主要完成函数链接和全局变量的链接。因此,那些没有改动的源代码根本不需要重新编译,而只要把它们重新链接进去就可以了。所以,人们就希望有一个工程管理器能够自动识别更新了的代码文件,同时又不需要重复输入冗长的命令行,这样,Make工程管理器也就应运而生了。
Make工程管理器就是个“自动编译管理器”,这里的“自动”是指它能够根据文件的时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作。用户只需要编写一次简单的编译语句就可以了。它大大提高了实际项目的工作效率,而且几乎所有Linux下的项目编程均会涉及它。
2.工作步骤
Make工作时的步骤为:
(1)读入所有的Makefile。
(2)如果该Makefile文件中通过include包含有其他Makefile文件,则读入被包含的Makefile文件。
(3)初始化文件中的变量。
(4)推导隐晦规则,并分析所有规则。
(5)为所有目标文件创建依赖关系链。
(6)根据依赖关系,决定哪些目标要重新生成。
(7)执行生成命令。
步骤(1)~(5)为第一个阶段,步骤(6)~(7)为第二个阶段。在第一个阶段中,如果定义的变量被使用了,那么,Make会把其展开在使用的位置,但不会完全马上展开。Make使用的是拖延战术,如果变量出现在依赖关系的规则中,那么仅当这条依赖被决定要使用时,变量才会在其内部展开。