(Linux) make/makefile的简单介绍以及使用

make和makefile的功能

什么是make和makefile,它有什么作用?我相信这是大部分人在刚接触make和makefile时疑惑。那我们就一起来看看它的答案吧。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
一个大工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,如果每次都要我们输入gcc命令进行编译的话,那对我们来说简直就是一件非常可怕的事情。而如果利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 make工具可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。 因此,有效的利用make和makefile工具可以大大提高项目开发的效率。

make和makefile的使用规则

看完上面这段介绍,我知道make和makefile的作用了,那又怎么去使用呢?
我们要知道make和makefile的核心规则是依赖关系和依赖方法

依赖关系里分为目标文件和依赖文件:
目标文件:通常是要产生的文件名称,目标文件可以是可执行文件。

依赖文件:是用来输入从而产生目标的文件,一个目标文件通常由几个依赖文件生成(比如由好几个源文件来编译链接出某一个可执行文件)。

依赖方法:

说简单点就将依赖文件生成目标文件的命令。

下面我们通过一个实列来进一步了解。

先创建两个文件,分别是test.c和Makefie
在这里插入图片描述分别对两个文件进行编辑

在这里插入图片描述
使用make命令,生成了目标文件mycode ./mycode 运行可执行程序 就打印出了运行结果。这就是make与makefile的简单使用。

在这里插入图片描述在Makefile文件里配置clean进行清空,当我们不需要生成的可执行程序文件时,使用 make clean 命令就可以完成对文件的清理工作。
在这里插入图片描述
从上面我们可以发现在使用make命令编译时什么都不加但是为什么清理时就需要加make clean,那是因为make在执行makefile文件里的内容时,从上往下执行,第一个依赖关系和依赖方法执行完之后就停止了,第一个make mycode 的mycode可以省略 ,但是第二个起就不能省略了,只能完整的使用 如:make clean 。

下图中我们可以发现,当执行了一次make命令之后,再去执行make命令就会提示make:xxxx is to date,这是说明不能连续的make ,但是连续的make clean 却不会报错:
在这里插入图片描述
原因是在makefile:中在clean 前加了一个 .PHONY 这个指令代表这一指令总是被执行,所以连续执行make clean不会提示。不能连续编译,是编译器的一种只能检查的表现,源文件在没有改变的情况下就没必要进行再编译,这里我们感受不出来它的必要性,对于一个大项目来说重新编译会浪费时间也没有必要,这也正是make/Makefile 的优势。
那编译器是怎么识别这个程序需不需要重新编译?(注意这个编译不是指所有源文件都重新编译,而是只将被改变了的源文件及依赖于它的目标文件进行重新编译

这是根据文件里关于时间属性来判断的(众所周知,Linux中的文件包括内容和属性)

在这里插入图片描述

每个文件都有三个时间:

1.Access:访问文件的时间

2.Modify:修改文件内容的时间(修改了我呢见内容,那文件属性就一定会发生改变)

3.Change:修改文件属性的时间

每次访问文件不一定修改Access的时间,因为访问文件发生的可能性是最大的,要是每一次访问都修改时间,那对于系统来说是一个很大的工程,访问文件的时间也没有那么重要,所以多次访问,当访问次数达到设定值就会改变一次文件的 Access的时间。文件的大小发生改变,那Modify的时间就会改变,文件的大小是文件的属性,所以Change的时间也一定会改变。Change的时间会随着用户chmod 手动改变文件的属性而改变。touch xxx 可以更新xxx文件的这三个属性。

源文件的Modify 没有改变,在已经编译好的情况下,就没有必要进行再编译,所以编译器只用比较依赖文件的Modify和目标文件的Modify时间,判断需不需要重新编译。若源文件的Modify 时间更新则可以进行再编译,不然就进行不编译。如果加了.PHONY ,系统就不会根据自己的判断去决定指令该不该执行,而是总是执行指令。

Makefile中还有一些自动化变量,常用的有如下几种:

自动化变量 说明
$@ 规则的目标
$^ 所有的依赖的列表,会自动去重
$< 规则的第一个依赖
$? 所有比目标新的依赖的列表

如下是在依赖方法中使用了自动化变量$@ 和 $^
在这里插入图片描述以上就是关于make/Makefile的相关介绍了,如果有不到位的地方,欢迎大家及时指正。

猜你喜欢

转载自blog.csdn.net/m0_52347974/article/details/129917193