我有一个具有生成文件且具有中断依赖关系的项目。除了用手或用手写的perl脚本检查每个源文件外,是否有任何已知最好的方法来生成可供makefile使用的项目的依赖项列表?为C/C++中的项目生成生成文件的依赖关系
31
A
回答
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 /目录中,并将它们自动编译为依赖项和全部。
6
GNU C预处理器cpp有一个选项-MM,它可以根据包含模式产生一个适合的依赖关系集。
0
Digital Mars C/C++编译器附带makedep工具。
17
现在读了this portion in particular我认为有一个更容易的解决方案,只要你有一个合理的最新版本的gcc/g ++。如果你只需要添加-MMD
您CFLAGS
,定义一个变量OBJS
代表你的所有目标文件,然后执行:
-include $(OBJS:%.o=%.d)
那么就应该把你俩一种简单有效的自动的依赖构建系统。
4
我只需添加这makefile文件和它工作得很好:
-include Makefile.deps
Makefile.deps:
$(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps
相关问题
- 1. Makefile - 依赖关系生成
- 2. 从文件名生成一个生成文件目标依赖关系
- 3. 生成文件和项目目录结构中的自动依赖关系
- 4. 关于生成maven依赖关系
- 5. 为不同的输出目录生成gcc依赖关系
- 6. Maven2:如何生成一个包含项目依赖关系名称的文件?
- 7. WIx刻录项目依赖关系不生成
- 8. GCC makefile依赖关系生成路径
- 9. 如何自动生成文件之间的依赖关系?
- 10. 如何检查依赖关系的生成文件?
- 11. (自动)跨多个生成文件依赖关系
- 12. 生成MATLAB m文件依赖关系树
- 13. '钢筋生成'不包括生成版本中的一些依赖关系
- 14. C库,生成文件头的依赖
- 15. 如何更改生成的工件的依赖关系?
- 16. 为Delphi生成单元依赖关系的工具
- 17. 在哪里给bpmn中生成的java类的依赖关系?
- 18. 如何添加依赖关系的Java文件,同时生成与节俭文件Bazel生成
- 19. 如何在Kbuild中添加对生成的源文件的依赖关系?
- 20. 为Oracle存储过程依赖关系图生成DDL
- 21. 从eclipse自动生成的依赖关系中排除文件夹?
- 22. 如何使用Maven依赖关系中的实体类生成QDomain文件?
- 23. Axis2 1.5.1生成的存根的依赖关系
- 24. 如何为.cpp和.h文件从变量生成依赖关系?
- 25. 生成具有所有依赖项的AAR文件
- 26. 生成的AAR文件不包含其依赖项模块
- 27. Apache Ant&Ivy:生成的错误依赖关系
- 28. Eclipse无法解析maven-bundle-plugin生成的依赖关系
- 29. 非GNU编译器的依赖关系生成
- 30. 生成继承层次的依赖关系树
不要落入这个陷阱,如果你有超过100个文件,因为它是第一次过慢。在这种情况下,您应该使用一次调用的内容,而不是每个文件一次。 Makedepend可能有这个选项。在工作中,我们使用自定义的perl脚本。 – 2009-03-08 12:57:42
谢谢,我会牢记这一点。我目前的项目有大约十几个文件,所以没有大的开销。此外,最初的构建需要20多分钟,所以我总是运行它,去喝点咖啡,然后运行增量构建。 – 2009-04-27 11:21:12
谢谢,这真的帮了我。你可以把`$(patsubst src /%,obj /%,$(patsubst%.cpp,%。o,$ <))'写成`$(patsubst src /%。cpp,obj /%o ,$ <)`。另外,使用选项`-MF $ @`选项而不是使用`> $ @`重定向输出会更有意义吗? g ++手册页警告你可能在stdout上有一些不需要的调试输出,但是你不会用`-MF $ @`得到。 – Maarten 2012-04-19 20:26:34