前言:
在上一期的博文中,我们对 Linux 下的编译器 - gcc/g++的使用进行了详细的讲解,今天我将给大家讲解的是关于 【Linux】项目自动化构建工具 —— make/Makefile 的详细使用教程!!
本文目录
(一)前情摘要
(二)背景介绍
1、Makefile 的基本认识
2、make 的基本认识
3、代码实现
(三)依赖关系与依赖方法
1、基本概念
2、深入理解
(四)项目清理
1、代码演示
2、.PHONY原理
(五)三个时间
1、make的判断机制
(六)总结
在上一期我们将 Linux编译器-gcc/g++使用 的使用的时候,我们通过对 C语言翻译的逐过程讲解知道了可执行程序 【a.out】的来历。
整体过程大概划分为以下几个步奏:
第一步,就是进行预处理:文件从【test.c】
经过预编译最终形成【test.i
】第二步,经过预处理之后,文件从【test.i】
经过编译最终形成 【test.s
】第三步,经过编译之后,文件从【test.s】
经过汇编最终形成 【test.o
】第四步,经过汇编之后,文件从【test.o】
经过链接最终形成 【a.out
】以上经过编译 加上链接的过程,大家有没有觉得看着十分的复杂,对于学习初期拿来练练手了解一下原理还可以,但是若有一天大家到公司中,面对那些大型的工程项目,轻则成千上万行代码,重则十几万甚至更多。
若是一次编译完成之后又修改了源代码,接着又想进行编译,此时便需要重新敲入指令,那会使得工作量变得很大,还显得十分的低效。
因此,基于上述原因,我们就诞生出了本期将要介绍的 ——> 【make/Makefile】
优势:
接下来,我们就对 【make/Makefile】 进行详细的讲解!!!
在正式应用之前,我们先对这两个进行概念上的理解!!!
定义:
文件
。它是一个工程文件的编译规则,它记录了原始信息如何编译的详细信息、描述了整个工程的编译链接等规则。功能:
makefile基于两个重要关系:
紧接着我们来看一下【MakeFile】的语法介绍:
.... : ...
[TAB]
[TAB]
...
命令解析:
很明显我们可以发现这是一个文件的依赖关系,
这一个或多个的目标文件依赖于
中的文件,其生成规则定义在
中。
说白一点就是说,
中如果有一个以上的文件比
文件要新的话,
所定义的命令就会被执行。这就是makefile的规则。也就是makefile中最核心的内容。
小结:
定义:
有了以上概念的了解,接下来我们就手动的去实现一下这两个基本工具:
make
指令,它就是自动在当前源文件的所在路径下搜寻Makefile,并解释里面命令,最后生成myfile综上所述:make是一条命令,makefile 是一个文件,两个搭配使用,完成项目自动化构建。
在上述我们讲【Makefile】时,我提到过关于依赖关系这个话题,可能许多小伙伴就是满头雾水,什么是依赖关系呢?依赖关系在这里怎么体会的呢?接下来,我们就在仔细讲讲这个 “依赖关系”
在上述我编写的 【Makefile】文件中,对于 myfile : myfile.c
因此我们就可以说它们之间存在一种【依赖关系】只有【myfile.c】存在才有【myfile】
上述,我们在【Makefile】中写入的是可以直接对文件进行编译,按照上节课我们所讲的在代码翻译为可执行程序的期间,经历好几个过程。
因为可执行文件【myfile】是依赖于汇编后形成的目标文件 【myfile.o】,但是现在我们并没有这个文件,因此就要去倒推一下如何获取这个 【myfile.o】
myfile.s
】这个经过编译之后文件,可是【myfile.s
】此时也不不存在,所以跳转到下一条依赖关系 myfile.o:myfile.s
gcc -c -o myfile.o myfile.s
myfile.i
】这个经过编译之后文件,可是【myfile.i
】此时也不不存在,所以跳转到下一条依赖关系myfile.s:myfile.i
gcc -S -o myfile.s myfile.i
myfile.c
】这个经过编译之后文件,此时源文件存在,执行gcc指令myfile.i:myfile.c
gcc -E -o myfile.i myfile.c
修改后如下图所示:
小结:
在上面的内容中我们已经对这个知识点进行应用了,这里我们在详细的展开说说
.PHONY:clean
clean:
rm -f myfile.i myfile.s myfile.o myfile
但是一般我们这种clean的目标文件,我们将它设置为伪目标,用【 .PHONY】 修饰,伪目标的特性是,总是被执行的。
小结:
首先,我们先来看看以下现象,有了这个现象的产生,紧接着我在带大家理解一下 几个时间的概念!!!
此时,很多小伙伴就会好奇,它是怎么知道的呢?make究竟是如何知道我们的可执行文件是否需要重新编译呢?
接下来,我再给小伙伴们看一个现象:
解析如下:
可执行文件
来说,它生成的时间一定是晚于源文件
的【因为中间要经过一系列编译 + 链接的过程】接下来我们可以通过【stat】这个指令来查看源文件和可执行文件的所有属性,具体如下:
Change time:表示最后一次对文件属性改变的时间,包括权限,大小,属性等
从上我们可以看出 【20:43:00】是比【20:43:01】要早的。因此【make】指令才会不起作用
那我们能否可以去欺骗一下make呢?
答案是可以的,此处我们可以使用这个【touch】指令,它除了创建文件之外还有其他功能哟!
接下来我们来看看现象是怎么回事:
小结:
1)当仅读取或访问文件时,access time 改变,而modify time ,change time 不会改变。
2)当修改文件内容时,modify time ,change time 会改变,access time 不一定改变。
3)当修改文件权限属性时,change time 改变,而access time ,modify time 不会改变。
这就是我们刚开始时将【Makefile】定义时提到的关于 时间关系 的详细解答!!!
到此,关于 make/Makefile 的知识点便全部讲解结束了。在后面的学习中,我们还将进一步的对其进行讲解!!!
接下来,我们来回顾一下本文都有哪些知识点:
.PHONY
】修饰的文件叫做【伪目标文件】;目标文件
的【Modify】时间而定的。以上便是本文的全部知识了,感谢大家的阅读!!!