可能重复:
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)
答案 0 :(得分:4)
$@
表示目标,因此在您的情况下为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
答案 1 :(得分:0)
SRC
等于gnu make中的通配符函数。它是与该路径匹配的文件列表。例如,它可能是
SRC=a.c b.c
对于规则,它取决于所有源文件,目标是test
,因此我们可以按如下方式扩展规则:
gcc -o $@ $^ $(CFLAGS) $(LIBS
gcc -o test $(SRC) $(CFLAGS) $(LIBS)
然后通过使用正确的扩展替换CFLAGS
,LIBS
和SRC
来跟进。
有关此问题的一些文档,请查看以下内容:http://www.gnu.org/software/autoconf/manual/make/Automatic-Variables.html
答案 2 :(得分:0)
(以防其他一些重要的解释没有达到目的)
“make”程序允许您使用所谓的自动变量。对于执行操作的每个规则,它会解析操作中指定的shell语句,并展开它找到的任何这些自动变量。变量扩展为在该点执行的特定规则的上下文中的值。
因此,在您的情况下,正在执行的规则是:
test: $(SRC)
在此规则中,“test”是目标,无论$(SRC)扩展到哪个,都是依赖项。现在,因为“make”解析了规则的action部分中指定的以下shell语句,
gcc -o $@ $^ $(CFLAGS) $(LIBS)
它将$ @和$ ^识别为自动变量。 $ @扩展到当前规则的目标,$ ^扩展为依赖项,分别是“test”和$(SRC)的扩展。它在扩展变量后执行shell语句。您可以通过观察“make”的输出来查看执行的最终扩展版本。
反过来,$(SRC)会扩展为“make”函数“wildcard”的结果。请记住,“make”中函数调用的语法是$(函数参数...),并扩展为函数调用的结果,在本例中是以“.c”作为后缀的文件列表