以下是我的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知道该规则 食谱负责制定所有目标。食谱是 只执行一次以制作所有目标。“
但是,我的输出结果如下:
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
这意味着配方已经执行了两次,对吗?但根据上面的引用,它应该只执行一次。
答案 0 :(得分:1)
多个目标意味着:
%.foo %.bar: %.c
您的规则将负责制作*.foo
和*.bar
。单次执行适用于具有相同词干的目标:如果必须同时baz.foo
和baz.bar
,则规则将仅执行一次,但如果baz.foo
和{{1}必须使它被执行两次(对于词干blargh.bar
和baz
)。
在您的情况下,您有一个目标(blargh
),因此它将针对您构建的每个目标文件执行(这是您大多数时候想要的)。