文章目录
- 1、make与Makefile是什么
- 2、为什么要有make与Makefile
- 3、怎么实现一个Makefile文件
- 3.1 如何编写Makefile文件
- 3.1.1 依赖关系
- 3.1.2 依赖方法
- 3.2 如何清理项目
- 3.2.1 如何编写
- 3.2.2 clean详解
- 3.3 make的使用
- 3.4 原理
- 3.4.1 查看文件修改时间
1、make与Makefile是什么
make是一个命令,Makefile是一个在当前目录下存在的一个具有特定格式的文本文件。
2、为什么要有make与Makefile
在VS编译器中,我们在编译执行代码的时候ctrl+f5就可以了,而在linux中我们需要使用gcc/g++ 配合选项并需要正确的格式才可以完成编译,这样是比较麻烦的,我们make与Makefile可以实现自动化构建代码的,当写好代码,只需要一个make指令就能完成整个文件的自动编译。
并且我们写gcc的时候可能会有错误,但是我们直接写到文件中,一次写正确,后面直接使用即可;
我们能够编译,也要能够清理,也是这个道理,我们一次写正确,后面直接使用即可。
3、怎么实现一个Makefile文件
首先我们先创建一个makefile文件,这里makefile单词一定要输入正确,不能出现错误,首字母m可大写可小写,我这里是大写。
touch Makefile/makefile //首字母m大写/小写都可以
3.1 如何编写Makefile文件
Makefile是当前目录下的一个普通文本文件,内容包含依赖关系和依赖方法。
首先先进入Makefile文件中,然后输入以下内容
test:test.cgcc -o test test.c
注意:我们在输入gcc 指令这一行的时候,必须要tab键。
3.1.1 依赖关系
在上面的Makefile中,test 依赖于 test.c
3.1.2 依赖方法
上面的Makefile中,gcc -o test test.c 就是依赖方法
3.2 如何清理项目
3.2.1 如何编写
首先进入Makefile,输入以下内容
.PHONY:clean
clean:rm -f test
3.2.2 clean详解
- 工程是需要被清理的
- 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
- 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
3.3 make的使用
当我们已经写好了Makefile文件后,我们直接输入make就可以自动编译代码了。
当我们想要清理可执行文件,我们输入make clean即可。
如果我们在Makefile中先写的是清理,输入make执行的就是清理工作,所以谁在前make就执行谁。
一般我们将清理工作写在构建的后面。
3.4 原理
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,并把这个文件作为最终的目标文件。
3. 如果test文件不存在,或是test所依赖的后面的test.c文件的文件修改时间要比test这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成test这个文件。
4. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
5. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
6. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
第三点可能会有疑惑,这里的意思其实是,当我们已经生成了可执行文件后,我们对test.c源文件进行修改,这时test.c的内容发生改变,我们再执行make,这时会生成新的可执行程序,如果没有更新内容,那么我们就没有必要再执行依赖方法。
此时就是没有更新源文件,我们再去生成的时候就会报错说test是最新的。
3.4.1 查看文件修改时间
使用stat命令可以查看文件的修改时间。
stat 文件名
这里有三个时间,Access、Modify、Change也叫做ACM时间。
Access:读取或进入文件的时间
Modify:最后一次文件内容改变时间
Change:最后一次文件属性改变时间
当我们对源文件内容进行修改之后,Modify时间会随之改变,这时Change时间也可能会改变,因为文件内容的改变会引发属性发生改变(比如文件的大小),所以change时间可能就会随之改变。
make就是根据源文件的修改时间与可执行文件的时间做对比,来选择是否要重新执行依赖方法。
这里我们可以看到源文件修改时间大于可执行文件修改时间,此时执行make,就会重新执行依赖方法,生成新的可执行文件。
这时可执行文件的时间大于源文件时间,再执行make就无效了,我们可以看看: