这里写目录标题
- 介绍
- 语法结构
- 总览
- 基础规则
- 简介
- 最简单的makefile
- 对于基础规则的理解和应用
- 总结
- makefile时尽量使用更独立的命令,减少文件之间的耦合度
- 需求以及解决
- 总结
- 补充(关于makefile中脚本命令的编写顺序)
- 一级目录
- 二级目录
- 二级目录
- 二级目录
- 一级目录
- 二级目录
- 二级目录
- 二级目录
- 一级目录
- 二级目录
- 二级目录
- 二级目录
介绍
makefile就是一个命令脚本文件,接下来我们介绍如何使用他
语法结构
总览
要注意,想要使用与makefile相配合的make命令的话,makefile文件必须命名为“makefile”或者“Makefile”
基础规则
简介
最简单的makefile
一个规则:目标:依赖
(tab缩进)命令
如下图所示,是一个最简单的Makefile脚本文件
目标:就是最后要生成的文件的文件名
依赖:就是生成可执行文件的源文件
下一行先起一个tab,之后输入正常情况下我们要在终端输入的命令
对于基础规则的理解和应用
假如我们要运行如上所示命令,我们可以将其写入脚本文件makefile。如下图:
首先对于第一个脚本,目标是hello可执行文件,hello.o是依赖文件
但是目前makefile文件所在目录内没有hello.o文件,所以,我们可以再写一个脚本,用来生成hello.o
如上图所示,我们有了makefile之后,直接make命令,就可以执行makefile脚本文件里的脚本了,而当makefile中某个脚本所用的依赖在目录里没有时,make命令会接着在makefile文件内寻找有没有能生成所需要的依赖文件的脚本,如果有,则执行生成所需要的依赖文件之后,再去执行相应的脚本
总结
makefile时尽量使用更独立的命令,减少文件之间的耦合度
需求以及解决
假如我们按照如上所示命令,进行多个源文件的联合编译,从而生成可执行文件a.out
那么如果我们要修改其中一个源文件的代码,之后,想要生成新的可执行文件的话,就要再次make,这样,其他的不变的源文件又被编译了一次,比较浪费系统资源,所以,我们最好在写此类多文件联编的命令脚本时,要尽量减少各文件之间的耦合度,但是因为是多文件联合编译,我们也不能将他们完全隔离,我们可以在链接阶段将他们进行联编,其他阶段,各自生成各自的文件,如下图:
这个makefile在终端的命令如上图所示,这样,如果其中一个文件被改变了,那么也不会影响到其他文件
先对各个文件独立编译生成各自的可链接文件.o后缀文件,之后再将他们的可链接文件进行联编,生成可执行文件
最终效果如下图所示:
可以看到,当我们对div函数进行了修改之后,再次make,他就只会去再次编译div函数,其他的不运行,这样,系统资源就被高效利用了
总结
这就体现了第二条规则,如果依赖被更新了,那么make会先去更新依赖,再去生成目标
(本质上,make在执行时,会检查每个依赖文件的修改时间,如果我们在生成了可执行文件之后,又去修改了某个源文件,那么该源文件的修改时间就会比之前生成的可执行文件的时间要晚,这在make看来是不被允许的,所以如果我们修改了源文件再去make,make检查到这里发现问题之后,会只执行那个被修改了的依赖文件的脚本,然后再去生成可执行文件)
补充(关于makefile中脚本命令的编写顺序)
假如我们把a.out的脚本放在文本的最下面,那么make在执行完第一个脚本之后,他就会认为自己的使命完成了,就不会继续向下执行了
也就是他会把第一个脚本当成自己的终极目标,所以,我们前面一直把a.out目标脚本放在第一个,但是也有解决办法:
我们可以加上一个关键字ALL:,规定好终极目标文件为a.out,那么接下来在makefile文件中的顺序就无所谓了