1、何为make和Makefile
makefile:是一个集成依赖关系和依赖方法的文件,当在一个工程项目中涉及的源文件过多,我们无法一 一使用指令逐个编译,这时候通过使用makefile可以指定编译所需的源文件,文件编译先后顺序,使用什么编译器,编译器使用什么样的编译选项,还可指定完成后的项目清理工作,通过一次makefile的书写则之后可多次完成项目的自动化构建,大幅提高工作效率
make:是一个解释makefile中指令的命令工具,从而完成项目自动化构建,生成可执行文件
2、详解Makefile与make的操作
-
makefile 的书写示例:
make指令会自动执行依赖方法即command,完成了对test.c源文件编译链接等工作生成mytest可执行文件 -
make 命令:
使用:只需在命令行输入make即可
当输入make指令后会自动寻找当前目录下的Makefile或makefile文件,在makefile得知目标文件是mytest,则根据依赖关系去寻找test.c完成依赖方法从而得到目标文件 -
依赖关系 :文件和文件之间的相关关系,如目标可执行文件依赖于.o文件,.o文件依赖于.s文件,.s文件依赖于.i文件,.i文件依赖于.c文件,在makefile的书写中为了简化可以简化为可行性文件依赖于.c文件
-
依赖方法 :如何通过依赖关系生成文件,也就是编译链接的命令
3、Makefile与make的优势
- makefile可解决文件依赖关系和依赖方法
- 上文说到通过一次makefile的书写则之后可多次完成项目的自动化构建,大幅提高工作效率
- 当make之后,若有某源文件发生了修改,则再次make只对修改过的源文件重新编译,这样避免了重复的无用功,降低系统开销。此外make可以并发编译
4、如何设置自动清理项目
语法:.PHONY–声明伪对象,其中伪对象:不管是不是最新的,每次都要重新生成,与之对应的就是上面链接需要用到的文件若是最新的则不需要重新编译
示例如图:
5、Makefile符号化书写
补充几种符号: $ @,$ ^,$ <
- $@:依赖关系中的目标文件(成果)
- $^:依赖关系中的依赖文件列表(原材料)
- $<:依赖对象的逐个
示例如图:
注意:
- 此处第六行代码的 gcc -c $< 其实省略了 -o test.o ,完整写法是 gcc -c $< -o test.o ,因为gcc -c 指令汇编 test.c 文件时会自动生成.o同名文件,故 -o test.o可省略,第四行代码同理
- 其次解释下 $<的依赖对象的逐个含义,即若第五行代码test.o依赖的文件不止test.c,还有test1.c等等文件,则会逐个.c文件去执行第六行代码