【Linux】make & makefile
文章目录
- 【Linux】make & makefile
- 1、makefile文件
- 2、make命令
- 3、make原理规则
- 4、.PHONY
- 5、编译与否的判断法
1、makefile文件
makefile实际上是一个文件,配置文件
充当Linux上的工程管理工具,可以实现自动化编译
makefile
是make
读入的唯一配置文件,makefile
关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,
makefile
定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。类似一个脚本,其中内容包含
make
所要进行的处理动作以及依赖关系。makefile
简单点理解就是各程序文件的组织结构
makefile所要进行的主要内容是明确目标、明确目标所依赖的内容、明确依赖条件满足时应该执行对应的处理动作
例如我们最终要实现a这个目标,但是需要依赖b,而b依赖于c的存在
对于大型工程,makefile提供的效率是非常重要的
所以,makefile的编写能力也反映了程序员完成大型项目的能力
2、make命令
make是linux中的一个常用命令
在当前目录下,输入make,系统会自动在当前目录中寻找名为Makefile或makefile的文件,并对之进行解释处理,根据makefile文件内容
针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)
Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入
Makefile文件的内容来执行大量的编译工作。Make将只编译改动的代码文件,而不用完全编译
当你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件而不是整个代码工程,因此,为编译完最终的目标(可执
行文件)节省了大量的时间提高工作连贯性。比如一个工程下面有A.c 、B.c、 B.c三个文件,在make生成可执行目标文件之后,改动了A.c,则再次make
时,只会执行有关A.c处理动作,其它的不处理
3、make原理规则
gcc hello.c -o hello
存在上述语句,可以明确:
hello.c
为原始文件hello
为目标文件
依赖关系:
hello
依赖hello.c
生成,故hello.c
为hello
的依赖文件,关系称为依赖关系
gcc hello.c -o hello
指令使得hello.c
生成hello
,这条指令就称为依赖方法
通过这个简单的makefile文件我们可以理解依赖关系和方法:
在 makefile 文件中,共有四组依赖关系和依赖方法 ,当使用 make 调用 makefile 文件中内容时,便开始执行 makefile 中的内容:
- test 依赖于 test.o ,但是 test.o 并不存在,跳转到下一组依赖关系
- test.o 依赖于 test.s ,但是 test.s 并不存在,跳转到下一组依赖关系
- test.s 依赖于 test.i ,但是 test.i 不存在,跳转到下一组依赖关系
- test.i 依赖于 test.c ,test.c 存在,这时开始执行依赖方法
- 由此开始,逐渐执行上面的依赖方法,一层层回退,逐渐生成 test.i 、test.s 、test.o ,最后生成可执行程序,make 执行完毕
4、.PHONY
phony是个考研词汇,意思是“虚假的,伪造的”
在这儿.PHONY
是一个修饰对象的后缀,修饰的对象被认为是“伪目标”,至于伪目标是什么,接下来会解释
makefile认为你写一个命令,比如说是clean,是一个目标文件,这样Make这个命令会认为clean是一个文件,这样让编写makefile更加的容易,但是有个
问题,如果说和你的makefile同级目录下还有一个clean的文件,那么你去make clean就会失败,这时候你就需要用
.PHONY
,说明这个是一个假的目标文件,这样你的make clean 就会成功执行
.PHONY
是为了避免文件重名造成的make失败执行而存在的一个文件标识
5、编译与否的判断法
对于程序来说,时间有两条线。第一条是源代码时间的一条线,第二条是形成的可执行程序的时间的一条线 。
有源代码,再有可执行程序。
可执行程序的最近修改时间比源文件的修改时间晚,就认为当前可执行程序是最新的,为了减少时间和其他开销,不执行编译;否则执行编译 。
我们可以通过touch
可执行程序达到刷新其修改时间的效果,这样就可以在make后不修改源文件的情况下进行编译,当然,这只是一个测试规则的方法。