使用GCC依赖项文件会导致Make每次都完全重建项目

时间:2011-06-12 23:52:55

标签: c++ linux makefile dependencies g++

我已按照在线说明设置gcc(实际上是g ++)来生成依赖项的.d文件,现在我的makefile看起来像这样:

CPPFLAGS := ... -MMD -MP
...
OBJECTS := $(shell find *.cpp *.s | sed -e 's/\.cpp/\.o/' -e 's/\.s/\.o/')
all: setupdir $(OBJECTS) link image

然后在文件的末尾:

-include $(pathsubst %.d,obj/%.d,$(OBJECTS:.o=.d))

正确生成.d文件,并且所有文件都显示在obj目录中。问题是,现在,即使没有为它们生成.d文件的程序集文件,每次运行make时都会重建整个源代码树。该项目编译不需要很长时间,但是,如何修复它以便make正确运行?

1 个答案:

答案 0 :(得分:1)

重要的是要注意-M不是依赖项的神奇子弹,在许多情况下,您需要指定某些标题,以便在它们发生变化时重新构建。事实上,让gcc处理依赖关系的最常见问题是不应该重构的事情(广泛取决于运行make的人使用的GCC版本。)

话虽如此,我并没有看到你正在做的事情有什么明显的错误。

我建议做的是消除shell技巧,因为很容易指定你想要的东西。 E.g。

foo_SOURCES = \
    src/foo.cpp \
    src/bar.cpp

foo_OBJECTS = $(foo_SOURCES:.cpp=.o)

foo_DEPS = $(foo_OBJECTS:.o=.d)

%.o : %.cpp
    $(CC) $(CFLAGS) ... $< -o $@
    $(CC) -M $< > $(@.o=.d)

# lots more rules and targets here

# and finally, at the bottom:

-include $(foo_DEPS)

这是我的元首形式,所以检查一下。我相信您的问题实际上是未包含的依赖项,但我没有看到您使用pathsubst的方式有任何明显错误。

正如人们在评论中指出的那样,使用debug on运行make可能会有所帮助,但是第一步是指定对象和依赖项而不与shell通信。

如果你正常工作,请尝试存储shell调用的结果并将它们回显到屏幕上。这比make的调试输出噪音要少得多。