背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 再一个,我们平时使用的集成开发环境,创建一个工程项目,其中的源文件不计其数,哪个需要先编译,哪个需要后编译,哪个需要重新编译,都不需要我们操心,编译器都替我们做了,而makefile里这一系列操作都需要我们自己决定。
- 但是,makefile有一个好处就是一但写好,只需要make命令整个工程自动编译,极大提高了编程效率。
- make是一个命令工具,makefile是一个文件,make用来解释makefile,两者搭配使用,完成项目自动化构建。
依赖关系
比如我们有一个.c的文件,我们想要生成他的可执行程序,是不是要依赖这个文件?
依赖方法
我们知道了要生成这么一个可执行程序,需要依赖这个,c文件,那么如何通过这个文件生成可执行程序?这就需要依赖方法。
实例代码
原理
- make 会现在当前目录下寻找叫做makefile或者Makefile的文件,名字只能是这两者之一。
- 如果找到,那么他就会去找a.out这个文件,并将其作为最终的目标文件。
- 如果没有目标文件,就会根据依赖文件和依赖方法来生成这个文件。
- 在寻找过程中,如果找不到依赖文件,那么make报错终止并且就会直接退出,对于定义命令的错误,或是编译失败,或者直接就不理。
项目清理
先看举例代码:
我们会发现,编译一次后,再不允许编译,再看例子:
这一次,我们在对源文件修改后就可以编译了。
再编译,又不允许,我们就很好奇,系统是根据什么来判断是否让我们编译?
答案是时间,acm,访问文件时间,修改文件内容时间,修改文件属性时间,而且是通过比对源文件和可执行程序的Modify时间
只要可执行程序的Modify时间比源文件的时间新,那么就说明我们对源文件查看或者修改过,而且未编译,此时就可以编译了。
其余两个时间是不行的。
但是我们还是有不修改源文件而只更新文件时间的命令。
touch命令,更新文件时间戳。
那么,在我们修改源文件后,有时候,因为源文件过多的原因,文件的修改时间可能没有修改,如果出现了无法编译的情况,那么我们就需要清理解决方案,也就是清理项目。
实际上,我们在进行编译的时候,没有生成目标文件,直接生成了可执行文件,在集成开发环境中,是会有各种临时文件生成的,当然,我们也可以用gcc 生成各种临时文件,但是博主懒。
补充:
另外要提到的一点是伪文件,就是加了.PHONY: , 加上他以后,意思就是总是被执行,也就是说,我不管你时间是否修改,只要你命令,我就执行。
而且值得注意的是,make指令只会执行makefile中从上到下第一组依赖关系和依赖方法。如果我们的文件依赖列表中的文件找不到,就会向下去找,找到以后执行生成,再返回去执行。
$@就是目标,$^就是我们的依赖文件列表