make命令和makefile文件
1. makefile的语法
2. make命令的选项和参数
3. makefile文件中的注释
4. makefile文件中的宏
5. 多个目标
6. 内置规则
7. 后缀和模式规则
8. 用make管理库函数
9. 高级主题:makefile文件和子目录
10.GUN make和gcc
10.GUN make和gcc
GNU的make命令和GNU的gcc编译器有下面两个有趣的选项。
第一个选项是make命令的-jN(字母j是英文单词jobs的首字母)选项,它允许make命令同时执行N条命令。如果项目的不同部分可以彼此独立地进行编译,make命令就可以同时调用几条规则。根据系统的配置情况,这种做法可以极大地缩短重新编译所需要花费的时间。如果有许多源文件,这个选项就值得一试。一般来说,你可以先从较小的数字(比如-j3)开始尝试。但如果需要与其他用户共享你的计算机,就要小心使用这个选项,因为其他用户可能并不喜欢你每次编译时都启动大量的进程。
另一个有用的选项是gcc的-MM选项。它的作用是产生一个适用于make命令的依赖关系清单。如果某个项目包含非常多的源文件,每个源文件又包含不同的头文件组合,则理清它们之间的依赖关系将非常困难(但又非常重要)。如果让每个源文件都依赖于所有的头文件,有时候你就会编译一些没有必要编译的文件。但从另一方面来看,如果忽略一些依赖关系,问题会变得更严重,因为你没有重新编译一些需要编译的文件。
实验:gcc -MM
以前面的例程为例直接执行gcc -MM main.c 2.c 3.c
执行结果如下:
实验解析
gcc编译器扫描源文件以查找include语句,然后以一种适合于直接插入到makefile文件中的格式输出需要的依赖关系清单。你只需先把这个输出结果保存到一个临时文件中,然后把它们插入到makefile文件中,即可得到一组完美的依赖关系规则。如果拥有gcc编译器,却还出现依赖关系的错误就不应该了!
在结束对makefile文件的介绍之前,我们有必要指出makefile文件并不仅用于编译源代码或创建函数库。只要是可以通过一系列命令从某些类型的输入文件得到输出文件的任务,你都可通过makefile文件来自动地完成。一个典型的“非编译器”用途是,通过调用awk或sed命令对一些文件进行处理,或甚至通过makefile文件来生成使用手册。你可以通过它对任何与文件操纵相关的任务进行自动化处理,只要make命令可以根据文件的日期和时间信息判断出哪个文件发生了改变即可。