Linux项目自动化构建工具make/Makefile
本文已收录至《
》专栏!
作者:
演示环境:CentOS 7
前言
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的,规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
正文
makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译工具!
makefile文件与语法规则
make指令的执行是以makefile文件存在为基础的,如果没有makefile则make指令无法执行!
makefile文件中写入任务,这些任务是由依赖关系+依赖方法构成和实现的!
依赖关系 = 目标对象 + 执行文件(执行对象)
依赖方法:处理执行对象产生目标对象的方法!
makefile语法格式:
如图,exe可执行程序的产生依赖与test.c文件,而exe可执行程序的产生方法(也就是依赖方法)是利用gcc去编译并自定义名称为exe最终产生exe可执行程序,这样就完成了一个任务的构建,一个makefile文件中可以写很多任务!
当然有些目标对象可能不需要执行文件,这种半缺失的任务写法也是合理的,,例如我们自己写的clean清理任务,实现自动化清理产生的可执行程序exe。同时也可以有多个执行文件(多个执行文件之间使用,隔开),例如声明与定义分离时我们需要所有文件一起编译产生可执行程序!
所以目标对象并不是一定会产生(或者说目标对象只是为了达成某种目的),可以说目标对象也是任务名!执行这个任务可能会产生对象,具体的看任务的目的和实现方法,而且产生的对象名也不一定和目标对象相同,也可以不同!这个可以依据个人喜好和公司规定进行设置!
这样每次我们修改完代码,就可以使用make指令进行exe程序的编译,测试完后立刻清除,在以后的项目编写中会有很多个任务,如果一句一句的通过指令执行效率太低,所以我们会经常使用到makefile提高效率!
makefile注释符 #
在makefile中,需要注释某些语句时可以使用:#注释语句
$@与$^代替依赖关系对象
我们在前面说过:依赖关系 = 目标对象 : 执行文件
那么在编程时,如果我们有一些参数经常需要替换,而不修改代码,经常使用的是宏定义,宏定义的原理是直接替换!
在makefile中,如果我们需要经常更换目标对象和执行文件,就可以使用$@代替目标对象,使用$^代替执行文件,这样每次我们只需要修改依赖关系而不修改依赖方法就完成make任务的执行目标!其原理就是C语言的宏替换!
make指令与执行逻辑
make调用makefile中的某一条任务指令:
make调用目标对象任务后会生成目标对象,并显示执行的方法(命令)!
注意:如果我们执行make指令还没没有写目标对象,则make会默认执行makefile文件中第一个任务,后面的其他任务不会执行!只有我们使用make指令并指定任务的目标对象make才会执行指定的任务产生目标对象!
可能会有人想到说,makefile文件如果写成Makefile会有影响吗?两个都存在怎么办?
makefile和Makefile两个文件都可以被make指令识别和执行,当两个文件都存在时make会优先选择makefile文件去执行!
如果我们的make指令在执行方法,发现执行文件不存在时会在文件中向下在其他任务中去寻找,找到了则先执行对应任务获取自己所需要的执行文件,然后再执行本任务!其中的原理是依赖栈实现的,所以类似于函数调用,一层一层开辟栈帧。
当然,在过程中产生的所需目标对象也会保留在目录中!
makefile中依赖方法也不一定只能写一句,可以写多句,例如我们不需要预处理编译等文件,可以产生对象并使用后就立刻删除,而且所以这么多逻辑可以规整为一个依赖方法!
makefile任务刷新策略
在makefile中,如果目标任务的执行可以产生目标对象,则执行文件如果没有修改,再次执行make指令会报错,因为make会判断文件是否被修改(判断修改时间),如果被修改才允许更新目标对象!
这时如果我们对源文件进行修改,或者touch一下修改源文件的修改时间就能再次使用make指令!
.PHONY修饰为伪目标
.PHONY是makefile文件中的一个关键字,表示对某个目标对象产生伪目标,这样无论目标对象的执行文件是否被修改,都可以重复执行这个任务!
被.PHONY修饰的任务可以无视任务刷新策略,重复执行这个任务!
这个关键字一般用来修饰clean清理任务!我们每次生成可执行程序,再删除,重复执行是非常合理的;当然其他场景下如果需要也可以修饰!
最后
makefile的知识介绍到这里就结束了,相信了解完的朋友们一定有了很多套make任务列表来加速自己的开发;通过makefile极大的提高了我们的开发效率,是我们不可缺少的工具之一!
本次Linux编译器gcc/g++的基本知识就介绍到这里啦,希望能够尽可能帮助到大家。
如果文章中有瑕疵,还请各位大佬细心点评和留言,我将立即修补错误,谢谢!
🌟其他文章阅读推荐🌟
🌹欢迎读者多多浏览多多支持!🌹
- 点赞
- 收藏
- 关注作者
评论(0)