我正在使用一个具有示例应用程序的库.样本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)
因人而异
第一个先决条件的名称.如果目标从隐式规则获得其配方,则这将是隐式规则添加的第一个先决条件(请参阅隐式规则).
先决条件是规则中列出的文件:
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是第二个先决条件(隐含的预编译目标文件).