【问题标题】:makefile aliases [duplicate]makefile别名[重复]
【发布时间】:2010-10-14 12:09:20
【问题描述】:
可能重复:
makefile aliases
请在下面的makefile中解释$@ $^
LIBS = -lkernel32 -luser32 -lgdi32 -lopengl32
CFLAGS = -Wall
# (This should be the actual list of C files)
SRC=$(wildcard '*.c')
test: $(SRC)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
【问题讨论】:
标签:
c
variables
gcc
makefile
【解决方案1】:
这些是special variables:
$@ 表示目标,所以在你的情况下它是test。
$^ 表示所有先决条件的名称,它们之间有空格。在您的情况下,它是所有 .c 文件的列表。
SRC=$(wildcard '*.c')利用wildcard function获取目录下所有.c文件的列表,然后赋值给变量SRC。
假设有两个 C 源文件 foo.c 和 bar.c。您的 makefile 有效地扩展为:
test: foo.c bar.c
gcc -o test foo.c bar.c -Wall -lkernel32 -luser32 -lgdi32 -lopengl32
【解决方案2】:
(以防万一其他一些很好的解释没有完全到位)
“make”程序允许您使用所谓的自动变量。对于执行操作的每条规则,它都会解析操作中指定的 shell 语句,并扩展它找到的任何这些自动变量。变量扩展为当时正在执行的特定规则的上下文中的值。
因此,在您的情况下,正在执行的规则是:
test: $(SRC)
在此规则中,“test”是目标,而 $(SRC) 扩展到的任何内容都是依赖项。现在,当“make”解析规则的动作部分中指定的以下shell语句时,
gcc -o $@ $^ $(CFLAGS) $(LIBS)
它将 $@ 和 $^ 识别为自动变量。 $@ 扩展为当前规则的目标,$^ 扩展为依赖项,分别是“测试”和 $(SRC) 的扩展。它在变量展开后 执行shell 语句。通过查看“make”的输出,您可以看到最终执行的扩展版本。
$(SRC) 将依次扩展为“make”函数“wildcard”的结果。请记住,“make”中函数调用的语法是 $(function param ...),并被扩展为函数调用的结果,在本例中为以“.c”为后缀的文件列表.