跟踪#include依赖关系的工具


175

有什么好的建议吗?输入将是头文件的名称,输出应是所有文件的列表(最好是树),包括直接或间接地包括它。


4
这与gcc中显示的“收藏夹”无关,而msvs却没有。因此,我们(I)正在寻找任何工具。
fantastory 2014年

70
为什么我不断发现“脱题”问题很有帮助?
jfritz42

5
@ jfritz42:应该获得“年度评论”奖!当主题太多,用户那么多时,主持人如何将问题标记为“主题外”?
龙猫

2
我想指出,还有很多工具可以处理cpp-dependenciesiwyudep-matrix#include依赖关系,这是一个用python编写的非常幼稚的工具。
不知情的

3
@ jfritz42的数字很明确:123个投票和62个收藏夹。很多人这样看。奇怪的SO标准。我也怀疑这样的问题在SuperUser上是否会有相同的好答案。
安德烈亚斯(Andreas)

Answers:


147

如果您有权访问GCC / G ++,则该-M选项将输出依赖项列表。它没有执行其他工具所做的任何额外工作,但是由于它来自编译器,因此它不可能从“错误的”位置拾取文件。


60
-H甚至给一棵树!
SamB

28
-MM跳过系统头文件
TheJosh 2014年

3
另外,带有该-o选项的编译器将把输出写入文件,而不是标准输出。
Hi-Angel

2
@SamB仅在没有错误的情况下有效,并打印到stderr而不是stdout。否则,此选项会更通用。
user877329 2013年

92

感谢KeithB。我查找了cl.exe(VS2008)的文档,并找到了/ showIncludes标志。在IDE中,可以从任何CPP文件的属性页中进行设置。

屏幕截图


1
在解决一些非常困难的编译错误/警告时,这非常有用。非常感谢!
Ashwin Nanjappa,2009年

在尝试优化预编译头文件时,这也非常方便!
fmuecke

在VS中工作时,我认为这是解决我的问题的最快方法〜:-)
yaobin 2013年

如果某些标头确实包含std c标头,则这似乎不起作用,例如math.h
abergmeier

29

对于较重的溶液,应检查出氧气。它会扫描您的代码库,并提供一个有效记录您代码的网站。它显示的许多内容之一是树木。

如果您希望能够将此工具的输出插入其他过程中,那么这可能对您不起作用(尽管doxygen确实可以将其输出为其他格式,但我对该功能并不真正熟悉)。但是,如果您只是想看一下依赖性,它应该会很好用。


20

我玩过一个名为cinclude2dot的工具。当我来到这里工作时,这对于获取相当大的代码库非常有用。我实际上已经考虑过最终将其集成到我们的日常构建中。


2
该工具运行异常出色。我在g ++的-M和doxygen上遇到了麻烦。
sleeparrow 2016年

我编写了一个python脚本来读取cinclude2dot的输出并获取映射中的所有依赖项,然后进行深度优先遍历以最终输出源森林。其中没有任何.cc/.c/.cxx文件的林(仅其中的.h文件)可能是多余的。
舒瓦

12

首先,cinclude2dot.pl是一个perl脚本,它分析C / C ++代码并生成#include依赖关系图作为点文件以输入到graphviz。

http://www.flourish.org/cinclude2dot/

如果您不想采用这种手动工具,那么在我看来,迄今为止最成功的工具是ProFactor中称为“ IncludeManager”的工具。

http://www.profactor.co.uk/includemanager.php

有一个免费试用版,而且很棒。这是一个完全集成的Visual Studio插件,因此双击此处的内容将带您到那里包含它的地方。

工具提示的鼠标悬停可为您提供所有您想要的信息,它使您可以向上/向下钻取,删除不需要的整个子树,查看除图形之外的表示形式,在匹配列表中循环浏览,这真是太好了。

如果您很快了解,则可以在试用期结束之前重构大型项目的#include结构。即使这样,它也不会花费太多,每个许可证约35美元。

就其功能而言,它几乎是完美的。不仅#include图形,而且跨共享文件的项目依赖关系,对构建时间的影响,网格中的详细属性完美。


我已经在我的C项目中成功使用了IncludeManager。我正在使用Visual Studio2013。–
smwikipedia

有点可疑。
sdd的


5

基于KeithB的答案,这是GNUmake语法,可以自动1)生成依赖文件,2)使它们保持最新,3)在makefile中使用它们:

.dep:
    mkdir $@
.dep/%.dep: %.c .dep
    (echo $@ \\; $(CC) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
.dep/%.dep: %.cpp .dep
    (echo $@ \\; $(CXX) $(IFLAGS) -MM $<) > $@ || (rm $@; false)
DEPEND := $(patsubst %.dep,.dep/%.dep,$(OBJ:.o=.dep))
-include $(DEPEND)

(确保将这些缩进更改为硬标签。)



3

了解C ++应该能够为您提供帮助:它建立了一个可以从Perl访问的数据库。


理解是商业性的,但却是令人难以置信的IMO。您可以免费试用。
skelliam


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.