182

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

4

10 回答 10

162

如果您有权访问 GCC/G++,则该-M选项将输出依赖项列表。它不会像其他工具那样做任何额外的事情,但由于它来自编译器,所以它不可能从“错误”的地方拾取文件。

于 2008-09-03T20:32:23.617 回答
95

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

截屏

于 2008-09-04T01:27:17.030 回答
30

对于重量级解决方案,您应该检查doxygen。它会扫描您的代码库,然后创建一个网站,有效地记录您的代码。它显示的众多内容之一是包括树木。

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

于 2008-09-03T19:03:11.477 回答
20

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

于 2008-09-03T19:07:57.440 回答
14

首先,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 图表,还有共享文件的跨项目依赖关系,对构建时间的影响,网格中的详细属性,完美。

于 2010-06-19T04:25:24.593 回答
13

好消息:redhat Source-Navigator(也可以在 Windows 上运行)。当然,编译器开关(前面提到过)具有出色的解析能力,我不确定这将如何处理 MFC、Qt 及其魔术关键字。

redhat Source-Navigator

于 2008-09-04T09:09:31.783 回答
6

基于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)

(确保将这些缩进更改为硬制表符。)

于 2009-11-19T13:59:26.317 回答
5

您还可以查看makedepend

http://en.wikipedia.org/wiki/Makedepend

http://www.xfree86.org/current/makedepend.1.html

于 2008-09-03T21:45:51.710 回答
4

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

于 2008-09-03T19:46:43.430 回答
2

cscope ( http://cscope.sourceforge.net/ ) 在独立的 xterm 中执行此操作,也可以在您最喜欢的编辑器中使用 - 它具有出色的 emacs 和 vi/vim 支持。

于 2008-09-06T03:45:54.743 回答