【问题标题】:Makefile builds everything each timeMakefile 每次都构建一切
【发布时间】:2017-07-09 17:54:31
【问题描述】:

我有以下 Makefile(简化为忽略不相关的东西):

BUILD_DIR=./build
OBJS = \
  $(BUILD_DIR)/main.o \
  $(BUILD_DIR)/common.o \
  ...

roo: $(OBJS)
    $(CXX) -o $@ $(OBJS) $(LFLAGS)

.PHONY: $(BUILD_DIR)
$(BUILD_DIR):
    mkdir -p $(BUILD_DIR)/passes

$(BUILD_DIR)/%.o: src/%.cpp $(BUILD_DIR)
    $(CXX) -o $@ -c $< $(CFLAGS)

但是,每个目标文件每次都会重新编译,即使我遵循规则在每个非假目标中直接使用 $@

我不认为这是 this 的重复,因为我在规则中而不是在配方中应用子目录,但我可能错了吗?如何让 Make 正确跟踪构建目录中的依赖关系?

【问题讨论】:

    标签: makefile build gnu-make


    【解决方案1】:

    您已经说过$(BUILD_DIR)/%.o 依赖于$(BUILD_DIR),但是每次将文件添加到该目录时都会触及该目录(例如通过此规则本身)。也就是说,$(BUILD_DIR)总是比它的目标更新。

    您似乎想自动创建构建目录。我认为最好的方法是

    $(BUILD_DIR)/%.o: src/%.cpp
        mkdir -p $(BUILD_DIR)/passes
        $(CXX) -o $@ -c $< $(CFLAGS)
    

    【讨论】:

    • 谢谢;完美修复
    • 或者您可以创建create-dir: PHONY-target。在这个目标中,您可以运行 mkdir -p ${BUILD_DIR}/passes,而 ${BUILD_DIR}/%.o 的依赖项将为 create-dir - 因此您可以在需要时重新使用它。
    • 测试没有意义。您不妨运行mdir -p。如果目录已经存在,它将是空操作。
    • @MadScientist d'you know,这是我以前从未想过的,在多年的 Make 经验中!但你完全正确。我将编辑答案以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    相关资源
    最近更新 更多