有什么好的建议吗?输入将是头文件的名称,输出应该是直接或间接包括它的所有文件的列表(最好是树)。
10 回答
如果您有权访问 GCC/G++,则该-M
选项将输出依赖项列表。它不会像其他工具那样做任何额外的事情,但由于它来自编译器,所以它不可能从“错误”的地方拾取文件。
感谢 KeithB。我查找了 cl.exe (VS2008) 的文档并找到了 /showIncludes 标志。在 IDE 中,可以从任何 CPP 文件的属性页进行设置。
对于重量级解决方案,您应该检查doxygen。它会扫描您的代码库,然后创建一个网站,有效地记录您的代码。它显示的众多内容之一是包括树木。
如果您希望能够将此工具的输出插入到其他进程中,那么这可能对您不起作用(尽管 doxygen 确实输出到其他格式,但我并不真正熟悉该功能)。但是,如果您只是想观察依赖关系,它应该会很好用。
我玩过一个名为cinclude2dot的工具。当我来到这里工作时,它对于处理相当大的代码库非常有用。我实际上已经考虑过最终将它集成到我们的日常构建中。
首先,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 图表,还有共享文件的跨项目依赖关系,对构建时间的影响,网格中的详细属性,完美。
好消息:redhat Source-Navigator(也可以在 Windows 上运行)。当然,编译器开关(前面提到过)具有出色的解析能力,我不确定这将如何处理 MFC、Qt 及其魔术关键字。
基于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)
(确保将这些缩进更改为硬制表符。)
您还可以查看makedepend:
了解 C++应该能够帮助您:它构建了一个您可以从 Perl 访问的数据库。
cscope ( http://cscope.sourceforge.net/ ) 在独立的 xterm 中执行此操作,也可以在您最喜欢的编辑器中使用 - 它具有出色的 emacs 和 vi/vim 支持。