首页 文章

具有多个目标的Makefile模式规则

提问于
浏览
0

下面是我的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知道规则的配方负责制作所有目标 . 配方只执行一次以制作所有目标 . ”

但是,我的输出如下:

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

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

1 回答

  • 1

    多个目标意味着:

    %.foo %.bar: %.c
    

    你的规则将负责制作 *.foo*.bar . 单次执行适用于具有相同词干的目标:如果必须同时执行 baz.foobaz.bar ,则规则将仅执行一次,但如果必须执行 baz.fooblargh.bar ,则将执行两次(对于词干 bazblargh ) .

    在您的情况下,您有一个目标( src/config-comp/%.o ),因此它将针对您构建的每个目标文件执行(这是您大多数时候想要的) .

相关问题