在 Makefile 中,$@、$< 等是自动变量(Automatic Variables),用于简化规则编写。以下是常用符号参数的说明:
1. 常用自动变量
| 变量 | 含义 | 示例(规则中) |
|---|---|---|
$@ |
当前规则的目标文件名 |
foo.o: foo.c → $@ = foo.o
|
$< |
第一个依赖文件名 |
foo.o: foo.c bar.h → $< = foo.c
|
$^ |
所有依赖文件列表(去重) |
foo.o: foo.c bar.h → $^ = foo.c bar.h
|
$+ |
所有依赖文件列表(不去重) | 若依赖重复出现(如 foo.o: foo.c foo.c),则保留重复 |
$? |
比目标更新的依赖文件列表 | 仅列出已修改且目标需要重新构建的依赖 |
$* |
匹配通配符 % 的部分(茎) |
%.o: %.c → $* = 文件名(不含扩展名) |
2. 其他常用符号
| 符号 | 含义 |
|---|---|
$(VAR) |
引用变量 VAR 的值 |
${VAR} |
同上,兼容不同语法 |
$$ |
转义为单个 $(用于 Shell 脚本) |
# |
Makefile 中的注释符号 |
% |
通配符(模式规则) |
* / ?
|
文件名通配符(类似 Shell) |
3. 示例
# 编译所有 .c 文件为 .o 文件
%.o: %.c
gcc -c $< -o $@ # $< = %.c, $@ = %.o
# 链接目标文件
app: main.o utils.o
gcc $^ -o $@ # $^ = main.o utils.o, $@ = app
# 仅处理已修改的依赖
update: lib.a
cp $? /backup # $? = 仅更新的文件
4. 注意事项
-
大小写敏感:自动变量必须用
$开头,且为小写(如$@正确,$@错误)。 -
特殊字符转义:在 Shell 命令中使用
$需写为$$(例如echo $$PID)。 -
模式规则:
%是通配符,$*是其匹配的部分。
掌握这些符号能大幅提升 Makefile 的编写效率!










网友评论