在g ++参数中使用时,"$ <"是什么意思?

10 makefile gnu-make

我正在使用一个具有示例应用程序的库.样本makefile包含$<在参数中:

all:test.cpp
    g++ -Wl,--no-as-needed -o Example $<
clean:
    rm -f SampleApp11
Run Code Online (Sandbox Code Playgroud)

我看了这个,教程点说

$ <导致操作的相关文件的名称.

另一个网站指出:

这是从.c构建.o的后缀替换规则,它使用自动变量$ <:规则的先决条件的名称(.c文件)和$ @:规则的目标名称(.o.文件)(参见关于自动变量的gnu make manual部分).co:$(CC)$(CFLAGS)$(INCLUDES)-c $ <-o $ @

我仍然感到困惑,这意味着什么?

Gal*_*lik 16

这实际上与编译器无关,它是Makefile语法的一部分,它在编译器运行之前被替换.

在您的示例中,它是目标之后的第一个依赖项(文件)all:- test.cpp.

如果依赖项发生更改,Makefile则基本功能是创建目标:

target: dependency.cpp
    rule to create target (using dependency.cpp)
Run Code Online (Sandbox Code Playgroud)

通常$<是编译器的输入,$@是输出.

它有点像这样(不是有效的Makefile):

$@: $<
    g++ -o $@ $<
Run Code Online (Sandbox Code Playgroud)

我记住它们的方式@类似于目标(如在目标练习中)并且<类似于箭头.所以我想象一个指向目标的箭头:

@ <-------- (think "Robin Hood")
Run Code Online (Sandbox Code Playgroud)

因人而异


Rus*_*nov 9

它是GNU make的自动变量之一.

第一个先决条件的名称.如果目标从隐式规则获得其配方,则这将是隐式规则添加的第一个先决条件(请参阅隐式规则).

先决条件是规则中列出的文件:

targets : prerequisites
        recipe
Run Code Online (Sandbox Code Playgroud)

例如,在以下规则中,第一个先决条件是test.cfile:

my_executable: test.c precompiled.o
    g++ -o my_executable $<
Run Code Online (Sandbox Code Playgroud)

它相当于以下内容:

my_executable: test.c precompiled.o
    g++ -o my_executable test.c
Run Code Online (Sandbox Code Playgroud)

这precompiled.o是第二个先决条件(隐含的预编译目标文件).