人生的态度是,抱最大的希望,尽最大的努力,做最坏的打算。 – 柏拉图 《理想国》
目录
- 一.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?













![LeetCode[295]数据流的中位数](https://img-blog.csdnimg.cn/img_convert/def2872e75a34ee9a738fabbf5603e7d.png)





