【Linux】make/Makefile的简单使用
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
人生的态度是抱最大的希望尽最大的努力做最坏的打算。 – 柏拉图 《理想国》
目录
一.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.chello就是我们的目标文件
- 依赖文件列表就是依赖关系中右边的文件
- 例如hellohello.chello.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