目录
前言:
想象一下,在一个大工程中,有大量的文件,每个文件中的代码都需要编译,我们每次编译都要写一大段的 gcc 命令,能不能简化这个重复的工作?答案是能。
什么是 make/makefile?
make 是命令,makefile/Makefile (首字母大小写皆可)是文件,makefile一旦写好了,只需要make 命令,整个工程完全自动编译,这两个搭配使用极大提高了软件开发的效率!
怎么使用 make/makefile?
假设我们现在写了一个代码,如下图所示,代码所在文件的文件名为 test.c :
在使用 make 命令之前,我们必须先写 makefile 文件,写通了 makefile 之后,make 命令才会顺利运行,否则会报错(如下图所示):
依赖关系和依赖方法:
清理:
clean:
rm -f mybin
怎么使用 make?
如何编写多文件的 makefile?
如果项目有很多文件需要编译,此时 makefile 要怎么写更便捷?
首先假设我们此时有很多个文件(如下图所示),把这么多的文件一个个敲进 makefile 文件中是很麻烦的一件事,我们可能会忘记文件名,而导致反复退出 vim 模式去查看:
ls >makefile
此时打开 makefile 就会发现所有的文件都在 makefile 里面了,我们就不需要一个一个地把文件敲进去! 删除不需要的文件名后,就可以进行 makefile 的编写。
写完 makefile 后,此时输入 make 命令时,会自动把我们省略的部分替换成对应的文件:
makefile 中还可以定义变量,make 时会自动替换,下图中若 src 需要定义多个文件,文件之间用空格隔开即可:
什么是PHNOY?
.PHONY:clean
ACM时间
上面我们提到,如果目标文件已经是最新的了,那么 make 命令不会更新目标文件,那么 make 怎么知道目标文件已经是最新的呢?这就需要提到ACM时间。
什么是ACM时间?
当我们输入命令 stat filename 时,可以查看文件的状态信息,信息中包含文件的 Access、Modify、Change时间。
Access 时间:
当我们用 cat 查看代码时,实际上就是在访问文件了,Access 时间会随之更新!
但不是每一次访问文件都会更新 Access 时间,如果短时间内频繁的访问同一个文件,Access 不会立即更新时间,而是累计到一定次数之后才会更新时间,因为频繁地更新时间,会增加系统的负担!
Change 时间:
Modify 时间:
当我修改了 test.c 的代码时,文件的 Change时间和 Modify 时间都更新了!
make 是通过对比时间来确定可执行程序是否更新了,那么 make 是根据哪个时间来确定可执行程序需要更新了呢?答案是 Modify 时间。
正常来说,源代码创建的时间比可执行程序早,源代码的 Modify 时间也会比可执行程序的 Modify时间早!
如果我们修改了源代码,那么源代码的 Modify 时间就比可执行程序的 Modify时间晚了, make 通过比较 Modify 时间,就知道源代码更新了,此时就会去更新可执行程序!