【问题标题】:Makefile pattern rule with multiple targets具有多个目标的 Makefile 模式规则
【发布时间】:2016-10-13 15:04:40
【问题描述】:

下面是我的makefile:

src/config-comp/%.o: ../src/config-comp/%.c
    @echo 'Building file: $<'
    @echo 'Invoking: GCC C Compiler'
    gcc-4.8 -std=gnu11 -DDEBUG=$(DEBUGOPT) -I"$(ROOT_DIR)/../.local/include" -O0 -g3 -Wall $(GPROF) -c -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

在src/config-comp中,我有两个C源文件,一个是config-comp.c,另一个是config-proxy.c。我读过 GNU make book 这么说

"如果一个模式规则有多个目标,make 知道该规则的 recipe 负责制作所有的目标。食谱是 只执行一次以生成所有目标。”

但是,我的输出如下:

Building file: ../src/config-comp/config-comp.c
Invoking: GCC C Compiler
gcc-4.8 -std=gnu11 -DDEBUG=0 -I"/home/cheng/crane/libevent_paxos/target/../.local/include" -O0 -g3 -Wall  -c -MMD -MP -MF"src/config-comp/config-comp.d" -MT"src/config-comp/config-comp.d" -o "src/config-comp/config-comp.o" "../src/config-comp/config-comp.c"
Finished building: ../src/config-comp/config-comp.c

Building file: ../src/config-comp/config-proxy.c
Invoking: GCC C Compiler
gcc-4.8 -std=gnu11 -DDEBUG=0 -I"/home/cheng/crane/libevent_paxos/target/../.local/include" -O0 -g3 -Wall  -c -MMD -MP -MF"src/config-comp/config-proxy.d" -MT"src/config-comp/config-proxy.d" -o "src/config-comp/config-proxy.o" "../src/config-comp/config-proxy.c"
Finished building: ../src/config-comp/config-proxy.c

这意味着配方已经执行了两次,对吧?但是根据上面的引用,它应该只执行一次。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    多个目标意味着类似:

    %.foo %.bar: %.c
    

    您的规则将负责生成*.foo*.bar。单次执行适用于具有相同词干的目标:如果baz.foobaz.bar 都必须执行,则规则将只执行一次,但如果必须执行baz.fooblargh.bar,它将是执行两次(对于词干bazblargh)。

    在您的情况下,您有一个目标 (src/config-comp/%.o),因此将为您构建的每个目标文件执行它(这是您大部分时间想要的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多