Linux——Makefile文件

Makefile/makefile

Windows环境下IDE会自动帮你完成makefile文件的编写,Linux上我们需要自己编写。
在这里插入图片描述

Makefile文件,我们可以将其理解为一个工程文件的编译规则,描述了整个工程的编译和链接等规则,它定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
----Makefile中可以执行操作系统的命令,一旦写好,只需要一个make命令,整个工程完全自动编译,可以使我们的项目工程的编译变得自动化,不需要每次都手动输入一堆源文件和参数,极大提高了软件开发的效率
make是一个命令工具,是一个解释Makefile中指令的命令工具。
特点

  1. Make工程管理器启动后,会根据MakeFile文件中的编译规则命令对源文件进行编译和链接,最终生成可执行文件;
  2. 每次make会检查每个源文件的修改时间戳(保证OS时间正确),避免多余的工作量;

Makefile文件的基本结构

target : prerequisite
	command

创建每一个目标体时所需要执行的命令(command),此行必须以制表符Tab开头。
对于这三个参数的解释如下:

target:规则的目标,也就是一个目标文件,可以是Object File(中间文件),也可以是可执行文件。还可以是一个标签(Label)。

prerequisite :依赖文件,要生成那个target所需要的文件或是目标;可以是多个,也可以没有。

command :make需要执行的命令。(任意的Shell命令),前面是一个Tab制表符,可以有多条命令,每条命令占一行。多个命令之间需要使用分号隔开
注意:命令中出现的字符‘#’到行末的内容会被认定为注释,但是当‘#‘’不在此行的行首时,不会被当做注释处理。
makefile文件中,规则的书写顺序是很重要的,makefile中应该有一个最终目标,其他的目标都是被这个目标所连带出来的,要让make知道你的最终目标。makefile中第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。make所完成的也就是这个目标
在这里插入图片描述

规则中的通配符

  • *:: 表示任意一个或多个字符
  • ? :: 表示任意一个字符
  • [...] :: ex. [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符,
  • [0-9]表示 0~9中任意一个数字
  • ~ :: 表示用户的home目录

在这里插入图片描述

Makefile文件的变量赋值规则

语法规则为:

	变量名称=值列表

变量的名称可以由大小写字母、阿拉伯数字和下划线构成。等号左右的空白符没有明确的要求,因为在执行 make 的时候多余的空白符会被自动的删除。至于值列表,既可以是零项,又可以是一项或者是多项。

   Value_List = 1    2    3

调用变量的时候可以用 (Value_List)或者是{Value_List}来替换,这就是变量的引用。

模式规则

模式规则类似于普通规则。只是在模式规则中,目标名中需要包含有模式字符“%”(一个)
包含有模式字符“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。
规则的依赖文件中同样可以使用“%”,依赖文件中模式字符“%”的取值情况由目标中的“%”来决定。
例如:对于模式规则“%.o : %.c”,它表示的含义是:所有的.o文件依赖于对应的.c文件。
模式规则中,至少在规则的目标中要包含“%”符号。

%.o : %.c ; <command…>

其含义是,字指出了从所有的.c文件生成相应的.o文件的规则。如果要生成的目标是”a.o b.o”,那么

“%.c”就是”a.c b.c”。

%.o : %.c

 $(CC) -c $(CFLAGS) $(CPPFLAGS)$< -o $@

表示把所有的.c文件都编译成.o文件。

其中,“ @ ”表示所有目标的集合,” @”表示所有目标的集合,” @”表示所有目标的集合,<”表示所有依赖目标的集合(在模式定义规则的情形下)。

自动化变量规则

关于自动化变量可以理解为由 Makefile 自动产生的变量。 在模式规则中,规则的目标和依赖的文件名代表了一类的文件。
在模式中表示文件,就需要使用“自动化变量”,自动化变量的取值根据执行的规则决定,取决于执行规则的目标文件和依赖文件。
在这里插入图片描述
make会自动识别命令中的自动化变量,并自动实现自动化变量中的值的替换。

环境变量——指定搜索路径

	VPATH=路径(多个路径之间用‘  :’分隔)

VPATH是环境变量,make中的一种特殊变量,使用时需要制定文件的路径;

	cc=gcc指定编译工具

VPATH和vpath的区别

vpath是关键字,按照模式搜索,也可以说成是选择搜索,搜索的时候不仅需要加上文件的路径,还需要加上相应的限制条件。
无论你定义了多少路径,make 执行的时候会先搜索当前路径下的文件,当前目录下没有我们要找的文件,才去 VPATH 的路径中去寻找。 如果当前目录下有我们要使用的文件,那么 make 就会使用我们当前目录下的文件。

深入理解隐式规则

在这里插入图片描述

当make发现目标的依赖不存在时, ->尝试通过依赖名逐一查找隐式规则,并且通过依赖名推到可能需要的源文件

1	app.out : main.o func.o
2	$(CC) -o $@ $^

1.发现依赖目标不存在

2.查找隐式规则,并自动导出func.c和main.c

3.根据文件后缀自动推到编译命令->CC -c -o func.o func.c

隐式规则的副作用
编译行为难以控制,大量使用隐式规则可能产生意想不到的编译行为

编译效率低下:make从隐式规则和自定义规则中选择最终使用的规则

当以来目标不存在时,make会极力组合各种隐式规则对目标进行创建,进而产生意料之外的编译行为

例:需要名为N.o的文件 : N.y->N.c->N.o

问题: make提供了多少隐式规则?如何查看隐式规则?

	make -p

make提供了大概上千种隐式规则,所以我们并不知道make会如何组合这些隐式规则,无法判断编译行为.
最后让我们看看make是怎么工作的??
在这里插入图片描述

今天就这么多!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值