文章目录
- 一、make/Makefile 的认识
- make
- Makefile
- 二、make/Makefile 基本使用
- 创建项目
- 清理项目
- make 指令的使用
- 三、makefile 的几个语法
- 关键字 PHONY :
- $ :
- 变量 :
- 四、makefile的语法推导过程
一、make/Makefile 的认识
我们一般使用 Visual Studio
(下面简称 VS
)时,它会帮我们自动链接文件。100 个源文件,通常会将它们都编译形成 .o
文件,然后全部链接,形成一个可执行程序,VS
自动将各个源文件编译,然后链接了,不用我们操心了。
make/Makefile
就是 Linux 项目的自动化构建工具。
make
make
是一个命令。
Makefile
Makefile
是一个文件。
是在自己当前目录下需要手动构建的一个文件,保存的是依赖关系和依赖方法。
- 依赖关系:
指的是:“ 为什么要帮你?”
语法:左侧是目标文件,右侧是依赖文件列表。
mytest:mytest.c
- 依赖方法:
指的是:“ 怎么帮你?”
语法:最开始加一个Tab
,然后写方法即可。
gcc -o mytest mytest.c
二、make/Makefile 基本使用
创建项目
-
首先创建一个源文件和 makefile 文件
注意: 必须叫makefile
(首字母大小写都可以),因为make
指令只认识makefile/Makefile
。 -
添加依赖关系和依赖方法
通过vim
打开makefile
文件并进行编辑,添加上依赖关系和依赖方法。
(如果对vim
的使用不熟悉,可以翻翻下面这篇文章:vim模式及部分操作)
注意: 依赖方法那行开头要空一个tab
-
编辑源文件
我们为了查看效果,简单写一小段代码:
#include<stdio.h>
int main()
{
printf("hhhhh\n");
return 0;
}
- 外部 make
通过make
指令,我们发现它自己实现了gcc -o mytest test.c
的命令操作,生成了mytest
可执行程序。
再次make:
紧接着make
,发现有提示,表明源文件已经是最新的了。
源文件没有改动,即使make
,也不会重新编译,源文件改动了,make
才会重新编译。
另一种方法是使用.PHONY
修饰目标文件,使其成为一个伪目标,总是被执行。
清理项目
- 添加依赖关系和依赖方法
这个的依赖文件列表为空,不需要依赖任何文件。
- 外部 make clean
执行clean
下的代码,删掉了mytest
文件。
清理这部分建议用PHONY
修饰,以保证不管什么情况下,总能执行清理工作。
make 指令的使用
从上面我们可以看到在编译部分我们使用的是 make
,而清理部分我们使用的是 make clean
。
其实,make
形成目标文件的时候,默认是从上到下扫描 makefile
文件的,默认形成的是第一个目标文件,所以第一个可以直接使用 make
。
比如我们将上面的 gcc
和 rm
两条指令换个位置:
结果如下:
make
指令变成了操作 rm
的指令,而操作 gcc
的指令必须通过 make mytest
来执行。
三、makefile 的几个语法
关键字 PHONY :
修饰目标文件为伪目标,使其总是被执行。
- 一般不把源文件设置为伪目标
每次都重新编译,会降低效率:当源文件过多、过大,每次都重新编译,效率降低;如果一个两个源文件出错,每次都全部重新编译,效率也会低。 - 一般把 clean 设置成伪目标
可以保证不管什么情况下,总能执行清理工作。
$ :
$@
:代表目标文件,$^
:代表依赖文件
变量 :
在开头定义,且等号左右不能加空格,使用时用 $
引出。
四、makefile的语法推导过程
mak
e执行一条指令时,先看当前的依赖方法,依赖方法没有办法实现的话,会递归向下,直到能够完成最初的依赖方法,再逆向执行依赖方法,这属于一条指令。
指向结果:
可以看到make
指令是从最下面一条指令开始执行的,直到向上执行生成了 mytest
文件。
本文到这里就结束了,如果对您有帮助,希望给一个赞哦!🌷
如有错漏,欢迎指正!😄