当前位置:网站首页>Makefile 语法及使用笔记
Makefile 语法及使用笔记
2022-08-04 14:08:00 【丨匿名用户丨】
文章目录
1、Makefile规则格式
<目标> : <依赖文件集合>
命令 1
命令 2
示例:
# -c : 编译生成同名目标文件(xx.o),不链接
# -o : 链接生成可执行文件(target)
target : main.o hello.o world.o
gcc -o target main.o hello.o world.o
main.o: main.c
gcc -c main.c
hello.o: hello.c
gcc -c hello.c
world.o: world.c
gcc -c world.c
clean:
rm *.o
rm abc
2、Makefile变量
Makefile中的变量都是字符串,类似 C语言中的宏。
变量相关符号:
符号 | 功能 | 描述 |
---|---|---|
= | 赋值符 | 变量的真实值取决于它所引用的变量的最后一次有效值。 |
:= | 赋值符 | 不会使用后面定义的变量,只能使用前面已经定义好的。 |
?= | 赋值符 | 如果前面已经赋过值了,就使用前面赋的值;如果变量没有被赋值就使用当前定义的值。 |
+= | 变量追加 | 给之前已经定义好的变量添加一些变量。 |
示例:
OBJ = main.o
OBJ += hello.o
OBJ += world.o
或者
OBJ = main.o hello.o world.o
target : $(OBJ)
gcc -o target $(OBJ)
main.o: main.c
gcc -c main.c
hello.o: hello.c
gcc -c hello.c
world.o: world.c
gcc -c world.c
clean:
rm *.o
rm abc
3、Makefile模式规则
%
:表示长度任意的非空字符串。类似于通配符。
# `%.o`:所有的以 `.o` 结尾的文件
# `%.c`:所有的以 `.c` 结尾的文件
# 当“ “%”出现在目标中的时候,目标中 “%”所代表的值决定了依赖中的 “%”值
%.o: %.c
<命令>
4、Makefile自动化变量
自动化变量 | 描述 |
---|---|
[email protected] | 规则中的目标集合,在模式规则中,如果有多个目标的话,“,“[email protected]”表示匹配模式中定义的目标集合。 |
$% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。 |
$< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“ “%””)定义的,那么““$<”就是符合模式的一系列的文件集合。 |
$? | 所有比目标新的依赖目标集合,以空格分开。 |
$^ | 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,““$^”会去除重复的依赖文件,只保留一份。 |
$+ | 和““$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。 |
$* | 这个变量表示目标模式中"%"及其之前的部分,如果目标 是 test/a.test.c,目标模式为 a.%.c,那么 “$*”就是 test/a.test。 |
示例:
OBJ = main.o hello.o world.o
target : $(OBJ)
gcc -o target $(OBJ)
# %.o 代表 main.o hello.o world.o
# %.c 代表 main.c hello.c world.c
# $< : 符合模式的一系列的依赖文件集合。即 `%.c` 代表的 main.c hello.c world.c
%.o: %.c
gcc -c $<
clean:
rm *.o
rm abc
5、Makefile伪目标
- 伪目标不代表真正的目标名,在执行 make命令的时候通过指定这个伪目标来执行其所在规则的定义的命令。
- 使用伪目标主要是为了避免 Makefile中定义的执行命令的目标和工作目录下的实际文件出现名字冲突。
- 如果
Makefile
同级目录有clean
文件,当执行make clean
时,规则因为没有依赖文件,所以目标被认为是最新的,因此后面的命令也就不会执行。 - 加了
.PHONY : clean
之后,make clean
后面的命令就都会执行了。
示例:
.PHONY : clean
clean:
rm *.o
rm abc
6、Makefile条件判断
ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数1>’ “<参数2>” # 参数使用单引号、双引号都是可以的
<语句>
else
<语句>
endif
ifdef <变量名 >
<语句>
else
<语句>
endif
7、Makefile函数使用
函数 | 功能 | 格式 | 示例 |
---|---|---|---|
subst | 字符串替换 | $(subst <from>,<to>,<text>) | $(subst zzk,ZZK,my name is zzk) |
patsubst | 模式字符串替换 | $(patsubst <pattern>,<replacement>,<text>) | $(patsubst %.c,%.o,a.c b.c c.c) |
dir | 提取出目录部分 | $(dir <names……>) | $(dir </src/a.c>) |
notdir | 提取出文件名部分 | $(notdir <names……>) | $(notdir </src/a.c>) |
foreach | 循环 | $(foreach <var>,<list>,<text>) | |
wildcard | 定义变量时的规则 | $(wildcard PATTERN……) | $(wildcard *.c) |
patsubst
:此函数查找字符串<text>
中的单词是否符合模式<pattern>
,如果匹配就用<replacement>
来替换掉,<pattern>
可以使用通配符“ “%”,表示任意长度的字符串,函数返回值就是替换后的字符串。如果<replacement>
中也包涵“ “%”,那么 中的“ “%”将是<pattern>
中的那个““%”所代表的字符串。foreach
:此函数的意思就是把参数<list>
中的单词逐一取出来放到参数<var>
中,然后再执行<text>
所包含的表达式。每次<text>
都会返回一个字符串,循环的过程中,<text>
中所包含的每个字符串会以空格隔开,最后当整个循环结束时,<text>
所返回的每个字符串所组成的整个字符串将会是函数 foreach 函数的返回值。
# 函数调用方式
$(函数名 参数集合 )
${函数名 参数集合 }
示例:
# 搜索当前目录下所有的 .c 后缀的源文件
SRC = $(wildcard *.c)
# 把 $(SRC) 里面所有的 .c 文件替换成 .o 文件
OBJ = $(patsubst %.c, %.o, $(SRC))
参考
边栏推荐
- 【无标题】
- 解题-->在线OJ(十八)
- 人像分割技术解析与应用
- SLAM 04.视觉里程计-1-相机模型
- 错误 AttributeError type object 'Callable' has no attribute '_abc_registry' 解决方案
- 并发程序的隐藏杀手——假共享(False Sharing)
- "Social Enterprises Conducting Civilian Personnel Training Specifications" group standard on the shelves of Xinhua Bookstore
- AutoCAD DWG,DXF文件导出高清图片、PDF
- JSX use
- This article sorts out the development of the main models of NLP
猜你喜欢
CCF GLCC正式开营|九州云开源专家携丰厚奖金,助力高校开源推广
烂大街的缓存穿透、缓存击穿和缓存雪崩,你真的懂了?
metaRTC5.0新版本支持mbedtls(PolarSSL)
按键控制开关4017芯片数字电路
Centos7 install mysql version rapidly
自监督学习未来是掩码自编码器?KAIST最新《自监督学习掩码自编码器》研究进展
化算力为战力:宁夏中卫的数字化转型启示录
如何才能有效、高效阅读?猿辅导建议“因材因时施教”
【模型部署与业务落地】基于量化芯片的损失分析
Theory 1: Deep Learning - Detailed Explanation of the LetNet Model
随机推荐
将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
Chinese valentine's day, of course, to learn SQL optimization better leave work early to find objects
Win11勒索软件防护怎么打开?Win11安全中心勒索软件防护如何设置
让Web页面中的编辑器支持黏贴或直接拖拽来添加图片「建议收藏」
centos7安装mysql急速版
谁说 Mysql 单表最大 2000 W ?我硬要塞它 1 个亿
文字编码 - Markdown 简明教程
router---编程式导航
华为手机切换屏幕效果_华为p40页面切换效果怎么换
自监督学习未来是掩码自编码器?KAIST最新《自监督学习掩码自编码器》研究进展
FreeConfig.h文件
Button control switch 4017 digital circuit chip
SMART S7-200PLC串行自由口通讯(耐压测试仪)
C# 动态加载卸载 DLL
idea permanent activation tutorial (new version)
Niuke.com Brush Question Record || Linked List
电子行业MES管理系统有哪些特殊功能
化算力为战力:宁夏中卫的数字化转型启示录
秋招攻略秘籍,吃透25个技术栈Offer拿到手软
Interviewer: How to view files containing abc string in /etc directory?