例如在
中$(CC) $(CFLAGS) -c -o $@ $<
他们是什么意思?
答案 0 :(得分:5)
$@ The file name of the target.
$< The name of the first dependency.
答案 1 :(得分:3)
$@
是正在构建的目标的名称 - 正在创建的程序或目标文件。
$<
是导致其重建的文件的名称是文件的名称'其存在允许为目标选择推理规则'。
在示例中,您可能有:
program.o: program.c
${CC} ${CFLAGS} -c -o $@ $<
在这种情况下,$@
是'program.o',$<
是'program.c'。 (由于“-c
”选项,规则必须生成目标文件。)
当心'$&lt;';如果有一个比程序更新的标题,'$&lt;'将匹配 - 然后编译行将无法正常工作。如图所示,它足够安全。
Beta评论'$&lt;'...
'make'的POSIX定义说:
$<
在推理规则中,$&lt;宏应评估文件名,其存在允许为目标选择推理规则。在.DEFAULT规则中,$&lt;宏应评估当前目标名称。 $&lt;的含义宏应另有说明。
例如,在.c.a推理规则中,$&lt;代表先决条件.c文件。
所以,在我给出的例子中,'$&lt;'在技术上是“未指定的”。并且,在正确的背景下, 这将是:
.c.o:
${CC} ${CFLAGS} -c -o $@ $<
然后'$&lt;'当'progname.o'正在建立时,它是无条件的'progname.c'。
某些版本的'make'用来做奇怪的事情; GNU Make(3.81)和Solaris 10 make似乎表现得很好。我怀疑,我陷入了时间扭曲。我使用了以下makefile:
all: x.o
x.o: x.c
${CC} ${CFLAGS} -c -o $@ $<
x.o: x.h
我使用“echo "int main(){return 0;}" > x.c
”和“echo > x.h
”来创建代码。从'x.c'和'x.h'中找出哪个文件并不重要;无论哪种方式,汇编都是“正确的”。我有一个旧的衍生衍生品,大约在1992年,在大多数方面都与当时的Sun MAKE兼容,这是错误的处理。
第7版UNIX程序员手册说:
指定创建具有后缀 s2 的文件的规则,该文件取决于具有后缀 s1 的类似命名的文件 作为'目标' s1s2 的条目。在这样的条目中,特殊宏$ *代表目标名称 后缀已删除,$ @表示完整目标名称,$&lt;有关先决条件的完整列表,以及$?列表 已过期的先决条件。
它没有说明在这种背景之外它意味着什么。我注意到第7版'make'会为'$&lt;'列出'x.c'和'x.h' - 但POSIX说这是不正确的。
SUN“制作用户指南”(1987年3月16日修订版A)说:
$<
依赖项文件的名称,就像make
选择用于隐式规则一样。
这或多或少符合你现在所看到的。
哦,这就是生活;事情在你周围变化。有时你发现它正在发生;有时你没有。