作者:小树苗渴望变成参天大树
作者宣言:认真写好每一篇博客
作者gitee:gitee
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
- 前言
前言
今天我们来讲讲再Linux中开发必备的一项技能,没有这个技能就不适合大型项目的开发,虽然后来这个功能会有专门的工具生成,但是我们要明白他的原理才行,就好比我们以后学了STL,但是也要学习底层原理,才能孰能生巧,今天讲的知识点就是自动化构建工具make/makefile,接下来我就给大家具体介绍一下吧
make: 是一条指令
makefile: 是一个项目目录下的文件
再我们的vs上我们不管是写一个文件还是多文件的项目,想要使程序跑起来,变成可执行程序,直接快捷键,或者上方按键点一下就行了,那为什么像vs这种开发软件可以直接将多个文件直接编译呢??他的底层肯定也有自动化构建的工具使他能完成这一系列的操作。
那我们的make就相当于快捷键,而makefile相当于把多个源文件打包再一个文件里面,通过make直接编译所有源文件,就不需要一个个gcc进行编译。而且清理生成的文件也可以放在makefile文件里面,实验make去执行。
给大家把模糊概念讲清楚了,接下来我就勇案例具体给大家介绍
我们创建一个叫make的项目目录,里面写文件,创建一个makefile,目前makefile文件里面是空内容。
接下来先来了解两个概念:依赖关系,依赖方法
有一天你给你爸打电话,说要打钱给我了,依赖关系是父子,依赖方法是打钱,缺少了这个依赖关系,就不会打钱给你了。大家先简单理解一下。
我们再上面说过,程序经过预处理,翻译,汇编,链接,生成下面几个文件,他们直接的依赖关系是什么:
hello.o , 它依赖 hello.s
hello.s , 它依赖 hello.i
hello.i , 它依赖 hello.c
想要编译这些文件或者重新清理文件,传统的方式是:
现在有了依赖关系和依赖方法,我们可以这样去做编译我们的程序,接下来我们再来编写makefile
我们退出保存,使用make试试:
我们对比一下makefile文件里面的内容,看着是从下往下面执行的,但实际从上往下扫描的,当依赖方法找不到对应的文件,就会往下面找,有点像栈的形式,大家试着理解一下,我们每次只需要使用一个make,就可以直接把我们想要的文件都生成了,不需要每个文件运行的时候都需要gcc一下太麻烦了。
对于清理文件:
伪目标:
.PHONY:clean//声明clean是伪目标文件
我们发现一次make之后,就make不行了,提示可执行程序是最新的了,我们来执行一下清理工作看看:
他可以执行很多次,按这个效果,我们把之前所有的都变成伪目标看看:
一般的我们只把清理工作弄成伪目标文件,为什么要这么做呢??
我个人理解是清理可以一直呗执行时当心清理不干净,而文件已经时最新编译状态了,就不需要再执行,大家知道伪目标文件就好的。
注意:
原因是当只输入make的时候,会优先匹配第一个目标文件进行执行,后面的执行就必须加目标文件名才可以,这一点大家要理解。
makefile怎么知道我的程序是最新状态的
再上面说到过,我们make一次之后再make就不行了,因为普通的目标文件不能总是被执行的,因为最新的可执行文件是最新的,就不能一直被执行,所以我们想要知道make是怎么知道我们的可执行文件是最新的状态,他肯定通过一定的指标去对比才会发现它是最新的
我们使用stat来查看:
它是通过这三个时间来对比之前的文件判断是否需要去重新执行make指令,具体就不给大家演示了,有兴趣的可以自己下来测试一下,大家知道他是这样判断的就行了。
多文件案例:
我们来看看自动化构建是怎么完成的:
相信大家应该堆自动化构建工具了解差不多了,对于我们学习来说,我今天所讲的大家掌握就足够了,以后到公司开发后,会有自动生成构建化的工具,不需要自己写了,那样就更方便了。
对比vs上的操作:
vs上的重新生成解决方案就相当于make
清理解决方案就相当于make clean
那我们今天的知识点就先分享到这里了,我们下篇再见