Make-learning
Make学习笔记
make是工具,Makefile是指导make工作的文件,而CMake则是生成Makefile的工具
要点:
- 终极目标是Makefile里面的第一个规则目标
- 目标下面的命令必须接的是Tab制表符,不能是空格隔开
- 在规则的命令前加一个@符号,则该命令不会打印在控制台
Makefile规则
目标:依赖
规则
目标:依赖
规则
...
变量
只有字符串类型,不需要声明
使用$符号对变量进行取值
运算符号
-
=
延后赋值,可以理解为引用
-
:=
一般的赋值,只会赋值当前值,可认为是一般的等号
-
+=
拼接字符串
模式匹配(通配符)
- %
表示任意长度的非空字符串。只能放在规则中。规则中出现%,则称为模式匹配
%.o:%.c
gcc -c $< #见下文,符合模式的一系列的依赖文件集合
#表示所有的c文件目标是生成.o文件
自动化变量
自动化变量 | 作用 |
---|---|
$@ | 规则中的目标集合,在模式规则中,如果有多个目标的话,“S@”表示匹配模式中定义的目标集合。 |
$% | 当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。 |
$< | 依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么“$<”就是符合模式的一系列的文件集合。 |
$? | 所有比目标新的依赖目标集合,以空格分开。 |
$^ | 所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。 |
$+ | 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。 |
$* | 。这个变量表示目标模式中"%"及其之前的部分,如果目标是test/a.test.c,目标模式为a.%.c,那么“$*”就是test/a.test。 |
伪目标
clean:
rm *.o
这个clean是为了将其作为一个删除的功能的,但是如果当前目录下有个文件就是叫clean,那么这个目标已经存在了,所以不会执行下面的rm的规则。图中第一个框框make clean是起作用的,但是后面新建了个文件clean之后,就不在起作用了(第二个框框)
而伪目标就是为了解决这个问题,将clean声明为伪目标就不会出现这个问题了
.PHONY:clean
clean:
rm *.o
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构