2008-11-24 85 views

回答

42

http://make.paulandlesley.org/autodep.html有很好的解决方案。

绝对。 g ++ -MM将生成一个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 [email protected] 

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

这将完成自动生成已更改的每个文件的依赖关系,并根据任何编译它们规则,你必须到位。这使我可以将新文件转储到src /目录中,并将它们自动编译为依赖项和全部。

+1

不要落入这个陷阱,如果你有超过100个文件,因为它是第一次过慢。在这种情况下,您应该使用一次调用的内容,而不是每个文件一次。 Makedepend可能有这个选项。在工作中,我们使用自定义的perl脚本。 – 2009-03-08 12:57:42

+0

谢谢,我会牢记这一点。我目前的项目有大约十几个文件,所以没有大的开销。此外,最初的构建需要20多分钟,所以我总是运行它,去喝点咖啡,然后运行增量构建。 – 2009-04-27 11:21:12

+1

谢谢,这真的帮了我。你可以把`$(patsubst src /%,obj /%,$(patsubst%.cpp,%。o,$ <))'写成`$(patsubst src /%。cpp,obj /%o ,$ <)`。另外,使用选项`-MF $ @`选项而不是使用`> $ @`重定向输出会更有意义吗? g ++手册页警告你可能在stdout上有一些不需要的调试输出,但是你不会用`-MF $ @`得到。 – Maarten 2012-04-19 20:26:34

6

GNU C预处理器cpp有一个选项-MM,它可以根据包含模式产生一个适合的依赖关系集。

0

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

17

现在读了this portion in particular我认为有一个更容易的解决方案,只要你有一个合理的最新版本的gcc/g ++。如果你只需要添加-MMDCFLAGS,定义一个变量OBJS代表你的所有目标文件,然后执行:

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

那么就应该把你俩一种简单有效的自动的依赖构建系统。

4

我只需添加这makefile文件和它工作得很好:

-include Makefile.deps 

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