在 Makefile
中,$@
、$<
和 $^
是自动化变量,用于简化规则中的命令书写。下面是它们的含义和用法示例:
1. $@
- 目标文件名(Target Name)
$@
代表当前目标的名称。- 在规则中,它被替换为规则左边的目标名称,即需要生成的文件。
示例:
output.o: source.c
gcc -o $@ source.c
在这里,$@
的值就是 output.o
,所以这一行等同于:
gcc -o output.o source.c
2. $<
- 第一个依赖文件名(First Prerequisite)
$<
代表第一个依赖文件的名称。- 它通常用于只需要一个依赖文件的规则中,例如编译单个源文件时。
示例:
output.o: source.c
gcc -c $< -o $@
在这里,$<
的值是 source.c
,而 $@
的值是 output.o
,所以这一行等同于:
gcc -c source.c -o output.o
3. $^
- 所有依赖文件名列表(All Prerequisites)
$^
代表所有依赖文件的名称,并以空格分隔。- 它用于需要所有依赖文件的规则中,例如链接多个
.o
文件时。
示例:
program: main.o utils.o lib.o
gcc -o $@ $^
在这里,$^
的值是 main.o utils.o lib.o
,而 $@
的值是 program
,所以这一行等同于:
gcc -o program main.o utils.o lib.o
总结
自动变量 |
含义 |
典型用途 |
|
当前目标文件的名称 |
生成目标文件 |
|
第一个依赖文件的名称 |
编译源文件生成目标文件 |
|
所有依赖文件的名称列表 |
链接所有依赖文件生成目标文件 |
综合示例
program: main.o utils.o lib.o
gcc -o $@ $^
main.o: main.c
gcc -c $< -o $@
utils.o: utils.c
gcc -c $< -o $@
lib.o: lib.c
gcc -c $< -o $@
在这个例子中:
program
的构建规则中,$@
表示program
,$^
表示所有依赖的对象文件main.o utils.o lib.o
。- 每个
.o
文件的规则中,$@
表示生成的.o
文件,而$<
表示相应的.c
源文件。