人生的态度是,抱最大的希望,尽最大的努力,做最坏的打算。 – 柏拉图 《理想国》
目录
- 一.Linux项目自动化构建工具-make/Makefile
- 1.为什么需要使用make/Makefile
- 2.简单理解make和Makefile
- 3.如何编写Makefile文件
- 3.1生成可执行程序:
- 3.2清理:
- 这里我们为什么使用的是make clean而不是make呢?
- 3.3.PHONY关键字
- 如何判断文件是否需要重新执行?
- 4.总结:
一.Linux项目自动化构建工具-make/Makefile
1.为什么需要使用make/Makefile
- 上文中,我们编译hello.c,需要使用gcc hello.c -o hello来生成可执行程序hello,每次我们要生成可执行程序,都要gcc一下,不免有些繁琐。
- 如果感觉上面麻烦一下也还可以接受,那如果我们的程序包含很多个源文件时,该咋整?用gcc命令逐个去编译时,就发现很容易混乱而且工作量大。因此我们要学会使用make/makefile。
有效的利用make和makefile工具不仅可以大大提高项目开发的效率。而且会不会写makefile,从侧面说明了一个人是否具备完成大型工程的能力
。
2.简单理解make和Makefile
- make是一个命令工具,是一个
解释makefile中指令的命令工具
,通过调用makefile文件中用户指定的命令来进行编译和链接的。 - makefile是一个文件
(当前源代码路径下)
,makefile文件中包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。
3.如何编写Makefile文件
makefile是一个围绕依赖关系和依赖方法
构成的一个自动化编译工具
我们介绍一下依赖关系和依赖方法:
- 依赖关系:
例如我们要生成可执行程序hello,他是依赖于我们的hello.c的,所以他们的依赖关系为hello:hello.c
. - 依赖方法:
在依赖关系的下一行(tab键开头),写下两者关系实现的方法,gcc hello.c -o hello
就是我们hello:hello.c这组依赖关系的依赖方法。
3.1生成可执行程序:
我们写下下面的内容:
我们输入make,发现他很快就执行了gcc hello.c -o hello
命令,生成了hello的可执行程序
3.2清理:
既然可以执行gcc hello.c -o hello
命令来生成可执行程序,当然也可以执行rm等你想要执行的命令。
对于依赖关系也有特殊,目标文件对应的依赖文件列表可以是空
。
- 目标文件:就是依赖关系中:左边的文件
- 例如:hello:hello.c,hello就是我们的目标文件
- 依赖文件列表:就是依赖关系中:右边的文件
- 例如,hello:hello.c,hello.c就是我们的依赖文件列表,为什么叫列表,就是因为一个目标文件可以依赖多个文件,即:右侧可以有多个文件。
我们就可以这样编写:
输入make clean
就能执行rm hello命令了。
这里我们为什么使用的是make clean而不是make呢?
- 因为单独使用make,
从上到下扫描,默认只会执行第一组依赖关系
证明:
我们将clean写在最前面
我们执行clean默认执行了rm hello
如要执行gcc命令,还要用make hello
3.3.PHONY关键字
PHONY
:总是被执行的!
什么意思呢?
当hello可执行程序已经存在时且是最新的,不需要再次进行编译,make就无法被执行
这种现象叫做不总是被执行的!
当我们想每次都可以执行成功时,我们就可以使用.PHONY关键字
.PHONY:目标文件
- 这样我们每次make都能成功
不过.PHONY对我们的源文件,没有什么意义
.PHONY一般都是来修饰我们的clean
。
如何判断文件是否需要重新执行?
当可执行程序已经是最新的时候,make就无法被执行,可他是如何判断的呢?
判断源代码和可执行程序的最近修改时间
- 当我们的源代码的时间早于可执行程序时,此时就没必要再次执行生成可执行程序,make也就不会被执行
- 当我们的源代码时间晚于可执行程序时,说明代码有改动,但最新的可执行程序还没有生成,所以make就可以被执行。
我们可以通过stat命令可以显示文件的状态信息
Modify代表文件内容被修改的时间,Change代表文件属性被修改的时间,Access代表最后一次访问文件的时间
源代码的最近修改时间早于可执行程序,make也就无法执行.
4.总结:
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
make是一个命令工具,是一个解释makefile中指令的命令工具
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 - makefile的一些简单使用
- 生成可执行程序
- 清理
- .PHONY关键字的使用
- 以及两个小问题
- 如何判断文件是否需要重新执行?
- 为什么使用的是make clean而不是make?