IT评测·应用市场-qidao123.com
标题:
makefile 知识点小结
[打印本页]
作者:
泉缘泉
时间:
2024-6-14 16:40
标题:
makefile 知识点小结
目录
makefile 定义变量的方式
1.递归定义
2 直接定义
3 条件定义方式
4 追加变量值
5 引用并修改变量值
6 override
VPATH用法:
1 VPATH vpath
各种规则
1.隐式规则(Implicit Rules)
2.静态规则(Static Pattern Rules)
3. 多目标规则(Multiple Target Rules)
4. 双冒号规则(Double-Colon Rules)
总结
makefile 定义变量的方式
1.递归定义
A=I love $(B)
B=China
复制代码
变量A的定义包罗了对变量B的引用,会在全文举行搜索变量B的值,此时A=I love China。
但这种定义方式有明显的缺点,即当接纳类似于A=$(A)的结构,就会无限嵌套迭代,最终使make执行失败。
2 直接定义
B=China
A:=I love $(B)
复制代码
此时,变量A通过“:=”直接定义,假如在前面的部分出现其引用的变量,则会举行定义,假如没出现,则不会定义。此处,A=I love China;假如变更位置,如下:
A:=I love $(B)
B=China
复制代码
此处,变量A定义前,B还没有定义,则A的值不包括China.
3 条件定义方式
A=apple
A?=I love banana
复制代码
此处对A举行了两次定义,第二次使用了“?=”举行条件定义,其寄义是,假如在变量A条件定义前没有定义,则定义为“I love banana”,否则就维持原值。个人将其理解有点类似于条件编译:
#ifndef A
#define A
复制代码
4 追加变量值
A=apple
A+=banana
复制代码
上式中,A=applebanana较易理解,不过多表明
5 引用并修改变量值
A=apple.c banana.c pear.c
B=$(A:%.c=%.o) #此处%是适配符,个人理解为调用的时候,前后值统一
复制代码
此处,第2行的意思是,将变量A中所有的.c后缀文件改名为.o文件,得到的结果是
B=apple.o banana.o pear.o,和patsubst(makefile内嵌函数)功能类似。
6 override
在终端执行make命令时,通常可以携带一个变量的定义,并且会覆盖makefile文件中的定义。该命令和追加通常一起使用,用法如下:
覆盖变量定义
:
makefileCopy CodeCFLAGS := -O2
override CFLAGS := -g -Wall
复制代码
在这个例子中,override 强制覆盖了之前定义的 CFLAGS 变量。即使 CFLAGS 在 Makefile 的其他位置已经被定义,使用 override 会使得新的值 -g -Wall 生效。
在包罗其他 Makefile 中使用
:
makefileCopy Codeinclude external.mk
override CFLAGS += -I$(DIR_INC)
复制代码
这里,external.mk 可能会定义一些编译选项或者其他变量,使用 override 可以确保不管 external.mk 中怎样定义 CFLAGS,我们都能在其底子上添加 -I$(DIR_INC)。
VPATH用法:
1 VPATH vpath
VPATH 和 vpath 都用于指定 Make 工具在搜索文件时应该查找的路径列表,特别是当 Makefile 和源文件不在同一目录下时,这两个指令非常有用。
VPATH 指令是 Makefile 的一个变量,用于设置搜索文件的路径列表。它可以是一个以冒号分隔的目录列表,类似于环境变量 PATH 的用法。比方:
makefileCopy CodeVPATH = src:include:../headers#设置了三个目录:`src`、`include` 和 `../headers`。当 Make 需要查找文件时,会按照这些目录的顺序进行搜索。
复制代码
vpath 是一个 Makefile 的函数式指令,用于临时设置某些文件的搜索路径。它的语法情势如下:
vpath %.c src:../common
复制代码
这个例子中,.c 末了的文件会在 src 和 ../common 目录中搜索。
各种规则
在 Makefile 中,有多种类型的规则,每种规则具有不同的特点和用途。以下是对几种常见规则的详细介绍:
1.隐式规则(Implicit Rules)
隐式规则是 Make 内置的一些通用规则,用于处理惩罚常见的构建任务。这些规则不必要明确地写在 Makefile 中,Make 会自动应用它们。比方,Make 知道如何从 .c 文件生成 .o 文件,因此你不必要为每个 .c 文件单独写一个规则,如下:
OBJS = main.o utils.o #设置变量
main: $(OBJS)
$(CC) -o $@ $(OBJS)#相当于gcc -o main main.o utils.o
复制代码
特点
:
简化 Makefile,减少重复代码。
自动处理惩罚常用构建步调。
可以被用户自定义的规则覆盖。
2.静态规则(Static Pattern Rules)
静态规则答应你为一组文件定义一个共同的构建规则,特别适合处理惩罚类似的一批文件。它们使用模式字符串(%)来匹配目标文件和依赖文件。
OBJS = main.o utils.o
$(OBJS): %.o: %.c
$(CC) -c $< -o $@
复制代码
特点
:
适用于多个目标文件共享类似的构建逻辑。
使用模式字符串举行匹配。
3. 多目标规则(Multiple Target Rules)
多目标规则答应你为多个目标指定类似的命令。这在多个文件必要执行类似利用时非常有用。
clean-exe clean-obj clean-log:
rm -f *.exe *.o *.log #*通配符,和%适配符不同
复制代码
特点
:
一条规则定义多个目标。
共享类似的命令。
4. 双冒号规则(Double-Colon Rules)
双冒号规则答应你为同一个目标定义多个独立的规则。每个规则都会被执行一次,而不是覆盖前一个规则。这在必要多次处理惩罚同一个目标时有用。
update:: file1
cp file1 /backup/
update:: file2
cp file2 /backup/
复制代码
特点
:
同一个目标可以有多个规则,每个规则都会被执行。
不会覆盖先前的规则。
总结
隐式规则
:自动应用常见的构建规则,简化 Makefile。
静态模式规则
:为一组文件定义共享的构建逻辑,使用模式匹配。
多目标规则
:为多个目标指定类似的命令,简化处理惩罚多目标的情况。
双冒号规则
:答应为一个目标定义多个独立的规则,全部执行。
根据详细的需求和场景选择合适的规则,可以有效地简化和优化 Makefile 的编写。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4