【问题标题】: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.cbar.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”为后缀的文件列表.

    【讨论】:

      【解决方案3】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 2020-04-23
        • 2013-09-03
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        相关资源
        最近更新 更多