【发布时间】:2011-05-25 08:09:18
【问题描述】:
这是我之前的问题的后续问题:SO 4403861,因为建议的解决方案破坏了依赖关系,使 makefile 无用。我不知道为什么。
我正在使用 gnu make 3.82 如果 obj 目录已创建,我有一条规则有效:
objdir:=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
但是,如果 obj 目录不存在,则 make 会失败。我想让make按需自动创建../obj,所以我添加了我认为非常简单的内容:
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
$(objdir):
if [ ! -d $(objdir) ] ; then mkdir $(objdir) ; fi
当我这样做时,每次都会强制编译。为什么?除非没有目录,否则 mkdir 不应该发生?为什么这个简单的改变会破坏依赖关系?
【问题讨论】:
-
正如我在回复您的问题/对我在 4403861 上的回答的评论所评论的那样:“您的规则说对象文件取决于对象目录 - 这意味着如果对象目录已更改由于目标文件是最后构建的(例如,因为您编译了另一个文件),那么您的文件需要重新构建。您的整体构建目标取决于存在的目标目录;单个目标文件不需要仅仅因为目录更改而重新构建。”