【问题标题】:Can I add object files as dependency?我可以添加对象文件作为依赖项吗?
【发布时间】:2021-11-24 20:20:59
【问题描述】:

我有一个用于多个电源的 makefile

info ::
        @echo "make main1/2/3"

PROGS = main1 main2 main3

.SECONDEXPANSION:
${PROGS} :: $$@.o
        ${CC} -o $@ $^

但是一个(并且只有一个)main 需要另一个链接的对象。我尝试用

解决这个问题
main3 :: lib.o

但不知何故,lib.o 并未添加到先决条件列表中。

链接线的顺序有所不同。

  • 我在PROGS 链接行之后添加了main3 行,然后由于缺少目标文件而导致炸弹爆炸。
  • 如果我在PROGS 行之前添加它之前,则首先使用我不想要的默认规则执行自定义行,然后无论如何都会执行PROGS 规则,然后它会爆炸。

有没有办法使用诸如$^ 之类的宏来链接对象?我当然可以从 PROGS 宏中分离出 main3,但该宏也有许多其他用途。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    您在似乎不需要它们的情况下使用双冒号规则。来自the manual

    具有相同目标的双冒号规则实际上是完全分开的。每个双冒号规则都是单独处理的,就像处理具有不同目标的规则一样。

    如果您想合并同一目标的不同规则(就像您对main3 所希望的那样),只需切换到普通(单冒号)规则:

    .SECONDEXPANSION:
    ${PROGS} : $$@.o
        ${CC} -o $@ $^
    
    main3 : lib.o
    

    您可以通过将static pattern rule 转换为static pattern rule 来简化您的${PROGS} 规则:

    ${PROGS} : % : %.o
        ${CC} -o $@ $^
    

    【讨论】:

    • 你说得对,我应该只使用单冒号。他们确实有自己的目的,但这不是其中之一。
    猜你喜欢
    • 2020-06-02
    • 2020-08-15
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多