3.3、Linux项目自动化构建工具make/makefile

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

背景

依赖关系

依赖方法

实例代码

原理

项目清理


背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 再一个,我们平时使用的集成开发环境,创建一个工程项目,其中的源文件不计其数,哪个需要先编译,哪个需要后编译,哪个需要重新编译,都不需要我们操心,编译器都替我们做了,而makefile里这一系列操作都需要我们自己决定。
  • 但是,makefile有一个好处就是一但写好,只需要make命令整个工程自动编译,极大提高了编程效率。
  • make是一个命令工具,makefile是一个文件,make用来解释makefile,两者搭配使用,完成项目自动化构建。

依赖关系

比如我们有一个.c的文件,我们想要生成他的可执行程序,是不是要依赖这个文件?

依赖方法

我们知道了要生成这么一个可执行程序,需要依赖这个,c文件,那么如何通过这个文件生成可执行程序?这就需要依赖方法。

实例代码

3.3、Linux项目自动化构建工具make/makefile_第1张图片

3.3、Linux项目自动化构建工具make/makefile_第2张图片

3.3、Linux项目自动化构建工具make/makefile_第3张图片

3.3、Linux项目自动化构建工具make/makefile_第4张图片

原理

  1. make 会现在当前目录下寻找叫做makefile或者Makefile的文件,名字只能是这两者之一。
  2. 如果找到,那么他就会去找a.out这个文件,并将其作为最终的目标文件。
  3. 如果没有目标文件,就会根据依赖文件和依赖方法来生成这个文件。
  4. 在寻找过程中,如果找不到依赖文件,那么make报错终止并且就会直接退出,对于定义命令的错误,或是编译失败,或者直接就不理。

项目清理

先看举例代码:

3.3、Linux项目自动化构建工具make/makefile_第5张图片

我们会发现,编译一次后,再不允许编译,再看例子:

3.3、Linux项目自动化构建工具make/makefile_第6张图片

这一次,我们在对源文件修改后就可以编译了。

3.3、Linux项目自动化构建工具make/makefile_第7张图片

再编译,又不允许,我们就很好奇,系统是根据什么来判断是否让我们编译?

3.3、Linux项目自动化构建工具make/makefile_第8张图片

答案是时间,acm,访问文件时间,修改文件内容时间,修改文件属性时间,而且是通过比对源文件和可执行程序Modify时间

3.3、Linux项目自动化构建工具make/makefile_第9张图片

 

只要可执行程序的Modify时间比源文件的时间新,那么就说明我们对源文件查看或者修改过,而且未编译,此时就可以编译了。

3.3、Linux项目自动化构建工具make/makefile_第10张图片

 其余两个时间是不行的。3.3、Linux项目自动化构建工具make/makefile_第11张图片

 但是我们还是有不修改源文件而只更新文件时间的命令。

3.3、Linux项目自动化构建工具make/makefile_第12张图片

touch命令,更新文件时间戳。

那么,在我们修改源文件后,有时候,因为源文件过多的原因,文件的修改时间可能没有修改,如果出现了无法编译的情况,那么我们就需要清理解决方案,也就是清理项目。

3.3、Linux项目自动化构建工具make/makefile_第13张图片

实际上,我们在进行编译的时候,没有生成目标文件,直接生成了可执行文件,在集成开发环境中,是会有各种临时文件生成的,当然,我们也可以用gcc 生成各种临时文件,但是博主懒。

补充: 

另外要提到的一点是伪文件,就是加了.PHONY: , 加上他以后,意思就是总是被执行,也就是说,我不管你时间是否修改,只要你命令,我就执行。

而且值得注意的是,make指令只会执行makefile中从上到下第一组依赖关系和依赖方法。如果我们的文件依赖列表中的文件找不到,就会向下去找,找到以后执行生成,再返回去执行。

3.3、Linux项目自动化构建工具make/makefile_第14张图片

$@就是目标,$^就是我们的依赖文件列表

你可能感兴趣的:(Linux,Linux)