12. Makefile基本语法

Make 的执行过程:

1、make 命令会在当前目录下查找以 Makefile(makefile 其实也可以)命名的文件。
2、当找到 Makefile 文件以后就会按照 Makefile 中定义的规则去编译生成最终的目标文件。
3、当发现目标文件不存在,或者目标所依赖的文件比目标文件新(也就是最后修改时间比 目标文件晚)的话就会执行后面的命令来更新目标。 这就是 make 的执行过程,make 工具就是在 Makefile 中一层一层的查找依赖关系,并执行 相应的命令。编译出最终的可执行文件。Makefile的好处就是“自动化编译”,一旦写好了Makefile 文件,以后只需要一个 make 命令即可完成整个工程的编译,极大的提高了开发效率。
总结一下,Makefile 中规则用来描述在什么情况下使用什么命令来构建一个特定的文件, 这个文件就是规则的“目标”,为了生成这个“目标”而作为材料的其它文件称为“目标”的依 赖,规则的命令是用来创建或者更新目标的。 除了 Makefile 的“终极目标”所在的规则以外,其它规则的顺序在 Makefile 中是没有意义 的,“终极目标”就是指在使用 make 命令的时候没有指定具体的目标时,make 默认的那个目 标,它是 Makefile 文件中第一个规则的目标,如果 Makefile 中的第一个规则有多个目标,那么 这些目标中的第一个目标就是 make 的“终极目标”。

Makefile变量

C语言一样Makefile也支持变量的,先看一下前面的例子:

main: main.o input.o calcu.o 
gcc -o main main.o input.o calcu.o 

上述Makefile语句中,main.o input.ocalcue.o这三个依赖文件,我们输入了两遍,我们Makefile比较小,如果Makefile复杂的时候这种重复输入的工作就会非常费时间,而且非Makefile加入了变量支持。不像Cintchar等各种类型,Makefile中的变量都是字符串!类似C语言中的宏。使用变量将上面的代码修改。
在这里插入图片描述
Makefile中变量的引用方法是“ ( 变 量 名 ) ” , 比 如 本 例 中 的 “ (变量名)”,比如本例中的“ ()(objects)”就是使用变量objects
1、赋值符“=”
给变量赋值的时候,不一定要用已经定义好的值,也可以使用后面定义的值。
在这里插入图片描述
在这里插入图片描述
把echo前面的@去掉后,执行结果如下:
在这里插入图片描述
2、赋值符“:=”
curname := $(name)
在这里插入图片描述
变量只使用已经定义好的,这个是“=”和“:=”的区别。

3、赋值符“?=”
如果前面已经赋过值了,那么就使用前面赋的值。

4、变量追加“+=”
Makefile 中的变量是字符串,有时候我们需要给前面已经定义好的变量添加一些字符串进 去,此时就要使用到符号“+=”,比如如下所示代码: objects = main.o inpiut.o objects += calcu.o 一开始变量 objects 的值为“main.o input.o”,后面我们给他追加了一个“calcu.o”,因此变 量 objects 变成了“main.o input.o calcu.o”,这个就是变量的追加。

Makefile 模式规则

模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%” 表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的 ,类似与通配符,a.%.c 就表示以 a.开头,以.c 结束的所有文件。

在这里插入图片描述

Makefile 自动化变量

上面讲的模式规则中,目标和依赖都是一系列的文件,每一次对模式规则进行解析的时候 都会是不同的目标和依赖文件,而命令只有一行,如何通过一行命令来从不同的依赖文件中生 成对应的目标?自动化变量就是完成这个功能的!所谓自动化变量就是这种变量会把模式中所 定义的一系列的文件自动的挨个取出,直至所有的符合模式的文件都取完,自动化变量只应该 出现在规则的命令中,常用的自动化变量如表 3.4.4.1:
在这里插入图片描述
在这里插入图片描述

Makefile 伪目标

Makefile 有一种特殊的目标——伪目标,一般的目标名都是要生成的文件,而伪目标不代 表真正的目标名,在执行 make 命令的时候通过指定这个伪目标来执行其所在规则的定义的命 令。 使用伪目标的主要是为了避免 Makefile 中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突,有时候我们需要编写一个规则用来执行一些命令,但是这个规则不是用来创 建文件的。
在这里插入图片描述
申明伪目标之后,即使和工作目录下的实际文件出现名字冲突(工作目录中有名称为clean的文件),make clean也能正常执行。
在这里插入图片描述

Makefile 条件判断

其中条件关键字有 4 个:ifeq、ifneq、ifdef 和 ifndef,这四个关键字其实分为两对、ifeq 与 ifneq、ifdef 与 ifndef,先来看一下 ifeq 和 ifneq,ifeq 用来判断是否相等,ifneq 就是判断是否不 相等,ifeq 用法如下。
Makefile 函数使用

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值