Makefile---自动化构建和管理项目的文件
1.介绍
在一个项目中,我们一般为了程序方便维护和提高可读性使用模块化编程,此时会产生许多个源文件和头文件,在进行编译,汇编,链接等操作时会比较繁琐,GNU组织是维护Linux的组织,它集成了MAKE工具方便项目自动化构建和管理,可以在其官网查找make相关文档进行学习。
make终端命令运行后执行Makefile文件,因此只需先在Makefile文件写好相关命令,然后再在终端调用make命令即可,make命令需要先安装,在Linux终端可以利用命令:sudo apt install make进行安装。
安装完成后,可以在man手册第1章查看make命令具体介绍,如下:
可以发现,make命令是用于解释Makefile这个配置文件的,所以调用make命令前要创建好Makefile文件,Makefile文件命名只能是Makefile或makefile,且没有扩展名。(一般建议命名Makefile跟Readme命名一致,项目文件结构清晰一点)
2.Makefile规则
2.1Makefile基本结构
从GNU官网的Makefile文件可以看到,Makefile的基本规则由4个部分组成,即目标,先决条件,制表符,命令。
- 目标:目标可以是文件名,通过先决条件的文件生成得到目标文件;目标也可以是命令名,比如clean,这种称为伪目标,为了将伪目标与文件目标区分出来,在伪目标后面加上标识:.PHONY:伪目标名字(eg. .PHONYCLEAN),当在终端输入make时执行的是除伪目标外的规则,当在终端输入make 伪目标名字(eg.make clean)才会执行该规则。
一个Makefile文件不应该只有伪目标!!!
-
先决条件:先决条件就是生成目标文件所需要的文件,比如要生成可执行文件需要.obj文件,那么对应的.obj文件就是先决条件。
-
制表符:按照标准要求来,按tab键不要按空格!
-
命令:命令就是要执行的动作,比如gcc -c main.c,每一个命令都是以tab缩进开头。
例子:
如果编译过程有需要多个目标,则终极目标必须写在最顶层!即最终生成的目标文件先写,比如源文件得到可执行文件的过程最终生成可执行文件一步写在最顶层!
2.3Makefile变量
在一个项目中我们可能会碰到这样一个情况:项目有许多个实现不同功能的源文件,现在需要先把源文件进行编译,再进行汇编操作,如果我们一个一个把先决条件的文件名打上去需要输入两遍,为了方便,可以用一变量存这许多个文件名,需要用到时引用变量即可,大大提高了效率。
Makefile的变量分为三种:自定义变量、系统变量、自动化变量。
2.3.1自定义变量
变量这里需要注意的是要用变量的值需要加一个$符号,表示引用,不然就是普通字符。自定义变量顾名思义就是我们自己定义的变量。
2.3.2系统变量
系统变量是内核已经存在的一些变量,我们可以直接用,不需要再定义,常见的系统变量如下:
2.3.1自动化变量
自动化变量是指变量的值会自动地发生变化,比如@变量代表其所在规则的目标名称,如下面规则@变量的值就是main,假如你把main改成main2那么@的值自动就变成了main2。
常见的系统变量如下:
还有一种常见的匹配规则如下面的$(OBJ):%.o:%.c表示找出OBJ变量里所有的.o文件,对应的每个.o文件匹配对应的.c文件名作为先决条件。