目录
基本了解
makefile基础语法
依赖关系
依赖方法
makefile文件内容格式
make执行机制
补充知识
机制解释
PHONY关键字
makefile补充语法
基本了解
在Linux中,make/makefile是项目自动化构建工具。如果我们没有make/makefile,那我们要编译一个文件,只能使用gcc/g++指令来进行编译,但是我们有了make/makefile之后,就可以使用make指令来自动编译,不用输gcc/g++指令。尤其是多文件的时候,一个make指令直接搞定。
make是一个指令,makefile是一个文件。
makefile/Makefile文件名都可以,需要我们自己手动创建。
浅看一下
makefile基础语法
make指令只认makefile文件。
makefile文件里写的是依赖关系和依赖方法。
依赖关系
依赖关系是表明为什么,即确定一个关系的链接。
依赖方法
依赖方法是被依赖者应该怎么做,是解决问题的一种具体的方法。
makefile文件内容格式
使用make指令时,make默认时从上到下扫描makefile文件的,默认执行的是第一组依赖关系和依赖方法。
举个例子
但是,我们执行多次make指令时,会发现一个问题。
关于这个问题,是make/makefile执行机制的问题
make执行机制
补充知识
一般来说,一个文件/目录都是有它的ACM时间的。这里补充一点,Access Time不是根据每次访问时间来刷新的,而是根据某种规则刷新的。
具体原因如下:Linux在被使用的过程中,访问一个文件/目录的频率是比较高的,但是每次访问都修改Access Time有点浪费效率,所以,Linux就设置特殊规则来控制Access Time的刷新。
机制解释
一个源文件(test.c文件)和可执行程序(mybin)的文件最经一次修改时间是不一致的。
即肯定需要先修改源文件,然后在编译链接形成对应的可执行程序。所以一定是先修改的源文件,再形成的可执行程序。
make指令可以可以通过比较可执行程序和源文件的最近一次修改时间(这里的时间是Modify Time)来确定是否需要再次执行指令。
为什么要这样做呢???
一般来说,源文件与可执行程序的时间先后分为两种:
1、可执行程序在前,源文件在后
对于这种情况,源文件一定是做了修改的,是最新的,而可执行程序是旧的,还是上个源文件的版本形成的可执行程序。所以这种情况下的make指令,需要被执行。
2、源文件在前,可执行程序在后
对于这种情况,可执行程序是新的,就是最新的源文件形成的可执行程序。所以此时make指令就不需要被执行,执行了也是白执行。
总结一下:make指令通过比较时间来知道可执行程序是新的还是旧的。可执行程序如果是新的,make指令就不执行。可执行程序如果是旧的,make就需要被执行。
注意:这里比较的时间是Modify Time,因为修改源文件一定修改的是源文件的内容。
但是,我们在已有指定文件的目录下,再去创建这个文件,就会刷新这个文件的ACM时间。
这样的话,就又可以执行make指令了。
PHONY关键字
那么我如果就想make一个目标,并且要求这个目标每次都被执行,每次都不走make的机制,总不可能一直刷新ACM时间吧,这有点离谱哈哈哈。
所以,make/makefile为我们提供了一个关键字PHONY。
被PHONY修饰的目标称为伪目标,伪目标总是被执行。
一般将clean设置为伪目标。
原因在于如果将编译链接目标设置为伪目标的话,每次都需要重新编译链接,大大降低了编译效率,若按照make的机制,则可以节省性能资源和提高效率。
makefile补充语法
1、#表示注释,相当于C/C++中的//
2、$@表示目标文件
3、$^表示依赖文件
4、makefile再开始写的时候也可以定义变量,相当于一种宏替换。
最后,如有不足,请各位大佬多多指教!!!