当前位置:网站首页>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))
参考
边栏推荐
猜你喜欢

metaRTC5.0新版本支持mbedtls(PolarSSL)

Is there a replacement for the LM2596?LM2576 can

解题-->在线OJ(十八)

Interviewer: How to view files containing abc string in /etc directory?

理论篇1:深度学习之----LetNet模型详解

第六届未来网络发展大会,即将开幕!

"Social Enterprises Conducting Civilian Personnel Training Specifications" group standard on the shelves of Xinhua Bookstore

橄榄枝大课堂APP正式启动上线

爬虫——selenium基本使用、无界面浏览器、selenium的其他用法、selenium的cookie、爬虫案例

智能电视可以打开小程序应用,再也不用头痛内存了
随机推荐
如何才能有效、高效阅读?猿辅导建议“因材因时施教”
idea permanent activation tutorial (new version)
Is the code more messy?That's because you don't use Chain of Responsibility!
开放麒麟 openKylin 版本规划敲定:10 月发布 0.9 版并开启公测,12 月发布 1.0 版
2042. 检查句子中的数字是否递增-力扣双百代码-设置前置数据
How to Identify Asynchronous I/O Bottlenecks
零基础可以转行软件测试吗 ?这篇文章告诉你
如何在ubuntu环境下安装postgresql并配置远程访问
编程思想_编程有必要给孩子学吗?
2546 饭卡(01背包,挺好的)
从理论到实践:MySQL性能优化和高可用架构,一次讲清
nVisual secondary development - Chapter 2 nVisual API operation guide Swagger use
[LeetCode] 38. Appearance sequence
文字编码 - XML 教程
ssm learning experience (final chapter)
TS - type
router---编程式导航
Lecture 4 SVN
国家安全机关对涉嫌危害国家安全犯罪嫌疑人杨智渊实施刑事拘传审查
Map常见的遍历方式-keySet 和 entrySet