在C / C ++中为项目生成makefile的依赖项

时间:2008-11-24 09:49:59

标签: c++ c makefile dependencies

我有一个项目,其中包含一个依赖于破坏的makefile。有没有最好的方法来生成我可以在makefile中使用的项目的依赖项列表,而不是手动或用手写的perl脚本检查每个源文件?

5 个答案:

答案 0 :(得分:48)

GNU make的文档提供了一个很好的解决方案。

绝对。 g++ -MM <your file>将生成兼容性的GMake兼容列表。我使用这样的东西:

# Add .d to Make's recognized suffixes.
SUFFIXES += .d

#We don't need to clean up when we're making these targets
NODEPS:=clean tags svn
#Find all the C++ files in the src/ directory
SOURCES:=$(shell find src/ -name "*.cpp")
#These are the dependency files, which make will clean up after it creates them
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES))

#Don't create dependencies when we're cleaning, for instance
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS))))
    #Chances are, these files don't exist.  GMake will create them and
    #clean up automatically afterwards
    -include $(DEPFILES)
endif

#This is the rule for creating the dependency files
src/%.d: src/%.cpp
    $(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF $@

#This rule does the compilation
obj/%.o: src/%.cpp src/%.d src/%.h
    @$(MKDIR) $(dir $@)
    $(CXX) $(CXXFLAGS) -o $@ -c $<

注意: $(CXX) / gcc命令必须为preceded with a hard tab

这样做会自动为每个已更改的文件生成依赖项,并根据您拥有的任何规则进行编译。这允许我将新文件转储到src/目录中,并自动编译它们,依赖项和所有文件。

答案 1 :(得分:19)

现在阅读this portion in particular我觉得有一个更容易的解决方案,只要你有一个合理的最新版本的gcc / g ++。如果您只是将-MMD添加到CFLAGS,请定义代表所有目标文件的变量OBJS,然后执行以下操作:

-include $(OBJS:%.o=%.d)

然后,这应该为您提供一个高效且简单的自动依赖构建系统。

答案 2 :(得分:6)

GNU C预处理器cpp有一个选项-MM,它根据包含模式生成一组适合的依赖项。

答案 3 :(得分:4)

我只是将它添加到makefile中,并且效果很好:

-include Makefile.deps

Makefile.deps:
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps

答案 4 :(得分:0)

Digital Mars C / C ++编译器附带makedep工具。