1

知道为什么这样的东西在 makefile 中不起作用吗?

all : $(GOAL_DB) $(GOAL)

%.d: %.cpp      
    $(CC) $(CPPFLAGS_DB) $<  > $@
%.o : %.cpp
    $(CC) $(FLAGS_DB) $< -o $@

$(GOAL_DB) : $(OFILES)
        $(CC) $(LFLAGS_DB) -o $@ $^ $(LIBS_DB)
    strip $(GOAL_DB)
    rm -f *.o *.d

%.d: %.cpp     
    $(CC) $(CPPFLAGS) $<  > $@
%.o : %.cpp
    $(CC) $(FLAGS) $< -o $@
$(GOAL) : $(OFILES)
        $(CC) $(LFLAGS) -o $@ $^ $(LIBS)
    strip $(GOAL)
    rm -f *.o *.d

我只是尝试使用 make all 和 GNU make 构建两个不同的目标。

第一个目标构建良好,但它没有为另一个目标创建新的对象文件。

4

1 回答 1

3

makefile 不像按顺序执行的标准程序。您似乎已经假设出现在新目标之前的新规则将适用于该目标。不是这种情况。在开始应用规则之前,makefile 会针对变量、目标、依赖项等进行全面评估。

Make 将仅将这些 $(OFILES) 与其中一个 %.d: 目标进行匹配,这可能是它找到的第一个目标模式。

您没有为另一个目标获取新对象的原因是为了使它看起来像您正在构建同一组文件两次,从而跳过第二次构建,因为它已经完成。

一种解决方案是使用“目标特定变量”:

all : $(GOAL_DB) $(GOAL)

$(GOAL): BUILD_FLAGS=$(FLAGS)
$(GOAL): BUILD_CPPFLAGS=$(CPPFLAGS)
$(GOAL): BUILD_OUTDIR=./outdir
$(GOAL): $(OFILES)

$(GOAL_DB): BUILD_FLAGS=$(FLAGS_DB)
$(GOAL_DB): BUILD_CPPFLAGS=$(CPPFLAGS_DB)
$(GOAL_DB): BUILD_OUTDIR=./outdir_db
$(GOAL_DB): $(OFILES)

%.d: %.cpp      
    mkdir -p $(BUILD_OUTDIR)
    $(CC) $(BUILD_CPPFLAGS) $<  > $(BUILD_OUTDIR)/$@

%.o : %.cpp
    mkdir -p $(BUILD_OUTDIR)
    $(CC) $(BUILD_FLAGS) $< -o $(BUILD_OUTDIR)/$@
于 2013-02-12T18:33:08.100 回答