首页 文章

Makefile列出了依赖项

提问于
浏览
0

在下面的Makefile片段中,makefile行为的正常方式是当foo.o在此处列出依赖项时,如/tmp/foo.o:abc.o xyz.o lmn.o等然后解析make转到列出如何的规则使依赖(abc.o xyz.o lmn.o),但这里目标/tmp/foo.o列出了没有依赖性,即使然后如何执行下一行或它只是被忽略 .

请尽快解释这个行(%.o:$$(addsuffix /%.c,foo bar)foo.h)的执行方式和原因 . 任何身体帮助都非常感谢 . 因为我在make文件上的演讲,我需要它 .

.SECONDEXPANSION:

/tmp/foo.o:

%.o:$$(addsuffix /%.c,foo bar)foo.h @echo $ ^

1 回答

  • 1

    这是一个奇特的makefile . 看来写这篇文章的人并不了解Make .

    使用 SECONDEXPANSION 会导致先决条件列表:

    $$(addsuffix /%.c,foo bar) foo.h
    

    要扩大两次;首先是这个:

    $(addsuffix /%.c,foo bar) foo.h
    

    然后到这个:

    foo/%.c bar/%.c foo.h
    

    This use of SECONDEXPANSION accomplishes nothing. 我们也可以像这样编写规则:

    %.o: $(addsuffix /%.c,foo bar) foo.h
        @echo $^
    

    或这个:

    %.o: foo/%.c bar/%c foo.h
        @echo $^
    

    无论如何,这是一种模式规则 . 如果您尝试构建 snaf.o (并且目标 snaf.o 没有明确的规则),那么Make将考虑此规则,匹配词干 snaf ,以便规则等效于此:

    snaf.o: foo/snaf.c bar/snaf.c foo.h
        @echo $^
    

    None of this has any bearing on the target /tmp/foo.o ,因为模式规则与其中包含斜杠的目标不匹配 . (如果模式规则是 /tmp/%.o: ... ,那将是一个不同的故事 . )因此这两个规则并没有真正相互作用,而且作者的意图也不清楚 .

相关问题