什么是$ @和$<在Makefile中?

时间:2010-03-16 14:49:14

标签: makefile

例如在

$(CC) $(CFLAGS) -c -o $@ $<

他们是什么意思?

2 个答案:

答案 0 :(得分:5)

$@  The file name of the target. 

$<  The name of the first dependency. 

有关详情:Makefile symbol reference

答案 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选择用于隐式规则一样。

这或多或少符合你现在所看到的。


哦,这就是生活;事情在你周围变化。有时你发现它正在发生;有时你没有。