C 生成文件别名
可能重复: 请在下面的makefile中解释$@$^C 生成文件别名,c,variables,gcc,makefile,C,Variables,Gcc,Makefile,可能重复: 请在下面的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) 这些是: $@表示目标,因此在您的情况下,它是测试 $^表示所有先决条件的名称,它
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文件的列表
SRC=$wildcard'*.c'使用获取目录中所有.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
SRC等于gnu make中的通配符函数。它是与该路径匹配的文件列表。例如,它可能是
SRC=a.c b.c
对于规则,它依赖于所有源文件,目标是test,因此我们可以按如下方式展开规则:
gcc -o $@ $^ $(CFLAGS) $(LIBS
gcc -o test $(SRC) $(CFLAGS) $(LIBS)
然后用正确的扩展替换CFLAGS、LIBS和SRC
关于这方面的一些文档,请看一下:,以防其他一些伟大的解释没有完全到位 make程序允许您使用所谓的自动变量。对于它为其执行操作的每个规则,它解析操作中指定的shell语句,并展开它找到的任何自动变量。变量扩展为在该点执行的特定规则上下文中的值 因此,在您的情况下,正在执行的规则是:
test: $(SRC)
在这个规则中,test是目标,$SRC扩展到的任何内容都是依赖项。现在,当make解析规则的action部分中指定的以下shell语句时
gcc -o $@ $^ $(CFLAGS) $(LIBS)
它将$@和$^识别为自动变量。$@扩展到当前规则的目标,$^扩展到依赖项,这分别是$SRC的测试和扩展。它在变量展开后执行shell语句。您可以通过查看make的输出来查看执行的最终扩展版本
$SRC将依次扩展为make函数通配符的结果。请记住,make中函数调用的语法为$function param…,并扩展为函数调用的结果,在本例中为后缀为.c的文件列表。完全重复: