make 删除依赖文件

Posted

技术标签:

【中文标题】make 删除依赖文件【英文标题】:make deleting dependency files 【发布时间】:2011-03-20 13:37:32 【问题描述】:

我这里不明白是gmake还是gcc我​​不确定。

我正在使用 -MM 和 -MD 选项为我正在使用的单元测试框架生成依赖关系规则。具体来说:

$(TEST_OBJ_DIR)/%.d: $(TEST_SRC_DIR)/%.cpp
  @$(CPPC) -MM -MD $< -o $@
  @sed -i -e 's|\(.*\)\.o:|$(OBJ_DIR)/\1.o $(TEST_OBJ_DIR)/\1.d $(TEST_OBJ_DIR)/\1.o:|' $@

-include $(TEST_DEP_FILES)

当我运行 make 时,在所有二进制文件都(正确)链接后,我在 make 退出之前看到以下额外的(无法解释的)行

rm test/obj/dice.d test/obj/regex.o test/obj/inventoryContainer.d test/obj/color-string.d test/obj/dice.o test/obj/inventoryContainer.o test/obj/color-string.o test/obj/regex.d

rm 命令从何而来?我在 makefile 中有一个 rm 命令的唯一地方是 clean 指令

test-clean:
  rm -f $(TEST_BIN_FILES)
  rm -f $(TEST_OBJ_DIR)/*.a,d,o

有什么想法吗?

【问题讨论】:

【参考方案1】:

如果需要将两个规则链接在一起,make 会自动创建intermediate files,但它会在构建结束时删除它们。您可以使用.PRECIOUS 特殊目标来防止它删除它们

【讨论】:

@rei 啊,是的。我知道 .SECONDARY 强制 make 将文件视为中间文件,但我没有意识到它也阻止了 make 删除它们【参考方案2】:

调试此类问题的一个有用选项是 -n 开关:

make -n TARGET

它将向您显示它将运行但实际上不会运行的命令。这使您可以查看正在触发哪些规则,但不会为您提供所有额外的输出,从而难以诊断问题。

-d 调试标志也很有用,但请确保在您可以轻松滚动的上下文中运行它,您将获得大量输出。我通常使用 emacs shell 模式,因为它具有良好的搜索功能并节省了缓冲区。

【讨论】:

以上是关于make 删除依赖文件的主要内容,如果未能解决你的问题,请参考以下文章

make自动生成依赖文件的两种形式

用make生成c源的目标文件时如何生成依赖文件

如何使用自动依赖生成器编写 make 文件

gnu make“删除中间文件”

简单的生成文件。为啥 .exe 被创建然后被 make 删除?

make编译二