makefile别名

时间:2010-10-14 12:09:21

标签: c variables gcc makefile

  

可能重复:
  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)

3 个答案:

答案 0 :(得分:4)

这些是special variables

$@表示目标,因此在您的情况下为test

$^表示所有先决条件的名称,它们之间有空格。在您的情况下,它是所有.c文件的列表。

SRC=$(wildcard '*.c')使用wildcard function获取目录中所有.c个文件的列表,然后将其分配给变量SRC

假设有两个C源文件foo.cbar.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)

然后通过使用正确的扩展替换CFLAGSLIBSSRC来跟进。

有关此问题的一些文档,请查看以下内容: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”作为后缀的文件列表