目录
背景
makefile简单编写
.PHONY
makefile中常用选项
makefile的自动推导
背景
会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
◉ 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
◉ makefile带来的好处就是——”自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
◉ make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
◉ make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
makefile简单编写
makefile主要由两部分组成:a.依赖关系,b.依赖方法
首先我们创建并打开makefile文件
vim makefile
接着我们编写内容
Test1.c内容
此时目录下有我们刚刚创建的文件,接着我们执行make命令
.PHONY
那如果我们想清理某个文件,该怎么写呢?既然是清理文件那还需要依赖什么文件删除吗?
这个时候需要用一个东西叫 .PHONY伪目标.
因为我们clean目的是清除某些文件,而删除操作又不会需要依赖文件,所以会创建一个伪目标,相当于依赖这个伪目标,然后执行依赖方法.
格式如下:
1.先在前面写一个.PHONY:clean
2.第二行紧接着输入clean:
3.Tab键开头,然后输入依赖方法 rm -rf mytest
然后我们使用一下它,执行 make clean
我们就会发现mytest被删除了
注意:如果我们不修改test1.cpp文件代码,持续make会发生如下情况:当前可执行程序已是最新版本
但是我们确可以一直执行make clean
原因就是.PHONY
的作用
在makefile中如果我们想无限执行mytest,只需将.PHONY:目标文件
即可
无限执行mytest并不好,之前在未修改原文件,持续执行mytest会造成运行效率低下,一个文件未被修改,持续生称mytest给编译器造成无用的负担。但是可以无限执行clean,因为清理还是很有必要的。那么编译器是怎么知道我的可执行程序是最新的呢?--> 根据文件的最新修改时间
stat可以查看一个文件重要的三个时间
❍ Access:最近的访问时间.
❍ Modify: 最近的内容修改时间,比如你修改了文件的内容,这个时间就会改变.
❍ Change:最近的属性修改时间,比如你修改了这个文件的读写权限,这样它的属性修改时间就会被修改.
一个文件是由内容+属性组成,如果文件内容被修改,那么文件的大小也会被修改,相应的属性修改时间也会改变,并且可执行文件形成的时间一定比源文件晚(这是操作顺序的原因),所以只需要比较两者的时间,只要可执行文件的时间比源文件晚,就说明这个可执行文件一定是最新的
那么如果只执行make,它执行的是makefile中的哪一段语句呢?
默认执行的是第一个依赖关系和依赖方法
我们来验证一下这个道理:我们通过交换clean 与 mytest来验证
此时我们就可以使用make 执行clean了
makefile中常用选项
我们先编辑makefile中的内容
test.c内容
#include<stdio.h>
int mian(){printf("hello Wuxu\n");return 0;
}
makefile内容
测试输出:
说明:
1️⃣ makefile支持定义变量,这是一门解释性语言,无需像C语言那样 int a = 10;
2️⃣ $
可以理解为取出对象
;$@
是一个特殊变量,它代表当前规则的目标文件名;$^
是一个特殊的宏,它代表当前规则的所有前置条件(即依赖文件列表)
3️⃣ 通过观察可知,echo是用来打印内容的,但是在这个echo中,$(src) $(bin)会被替换打印
4️⃣ 如果我们执行make/clean语句,不想打印出相关信息,可以在依赖方法前加@表明@
:在命令前使用@
可以阻止make打印这条命令
此时只会打印echo语句执行的命令了
makefile的自动推导
我们先完整执行一下makefile
通过代码与执行语句我们可以发现make/makefile会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法
注意:
1️⃣ 语句第一条必须是最终结果,如果最终目标颠倒顺序,程序不可执行
2️⃣ 除了最终结果代码之外,其余的可以随意调换位置
3️⃣ 整个推导过程是递归的,与栈类似