【问题标题】:Visualizing a huge C++ project using Doxygen + Graphviz使用 Doxygen + Graphviz 可视化一个巨大的 C++ 项目
【发布时间】:2012-07-24 06:33:14
【问题描述】:

我继承了一个需要移植到 Linux 的大型 C++ 项目。该项目中有超过 200,000 行源代码,分布在 300 多个文件中。有一个可视的依赖/包含树来引用这个项目会非常有帮助,这样我就可以大致了解应用程序的内部结构。这也将帮助我找到核心模块和 Windows 头文件之间的“故障线”,以便我以后可以将它们存根。

Visual Studio 中的类查看器根本没有剪切它。我四处阅读,了解到 Doxygen 是列出依赖项的常用工具。我更像是一个视觉化的人,发现这并没有太大帮助。幸运的是,我了解了 Graphviz 插件,它使用了一种叫做“Dot”的东西,它使我能够为部件生成依赖关系树。不幸的是,为特定文件生成了数百个较小的依赖关系树,而不是像我希望的那样拥有一个大的依赖关系树。以下是几个例子:

如您所见(我希望),当图形变得太大并且子节点变灰时,Doxygen/GraphViz 似乎放弃了。然后,如果我想查看树下方的内容,我必须查看该特定节点的图表。这不仅限制了图形的视觉帮助,而且如果子节点依赖于原始图形中的任何节点,这些节点将再次显示。这会导致大量重复连接,这使得从概念上将图形与任何给定文件隔离开来非常困难。结果,我感觉自己被“放大”了,还是看不到全貌。

我尝试在 Doxygen 的专家视图中使用 DOT_GRAPH_MAX_NODES 设置,但这似乎不会影响正在生成的图表的范围。从任何给定运行生成的输出来看,似乎 Doxygen 本身正在生成数百个图形文件,而 Graphviz 只是忠实地为每个文件生成图形。 是否有任何已知的方法可以让 Doxygen 生成一个大图形文件而不是数百个较小的图形文件?

或者,是否有任何免费的可视化图形解决方案知道如何使用嵌套的预处理器指令、MIDL 接口和手动定义的包含路径来处理复杂的 C++ 项目文件,就像 Doxygen 那样?

我的搜索是寻找一般的绘图实用程序(或有关它们的问题),但没有特定于大型 C++ 项目。当然,多年来完成的所有编码都必须有人拥有这样的工具!

谢谢, -亚历克斯

【问题讨论】:

    标签: c++ doxygen graphviz dot


    【解决方案1】:

    您可以使用 doxygen 生成的 XML 文件,并将它们合并成一个巨大的点格式图形文件(使用 xml 样式表或类似的),然后在其上运行 graphviz。

    当图形数量较多时,Doxygen 自动调用 graphviz 最有用。对于单个图,自动创建内容很重要,但自动调用dot,就没那么重要了。

    【讨论】:

    • 嗯,但不要认为这解决了重复节点问题。 IE:图 A 包括节点 B 和 C(每个节点都有自己的图)。图 B 还包含节点 C。因此,如果将图 A 和图 B 合并,则节点 C 将被包含两次。 :-/
    • @Alex:对同一节点名称的所有引用都折叠到图上的单个节点中。这就是 graphviz 语言的工作原理。 (我鼓励刚接触 graphviz 的你在抱怨之前先尝试一下我的建议。)
    • 谢谢,我不知道它可以处理。正如您所建议的,我现在正在尝试基于来自 Doxygen 的 XML 文件生成一个新的 GraphViz 图。通过在 Doxygen 生成的 combine.xlst 文件上运行 xsltproc,我设法将它们组合成一个“all.xml”文件。 (这花了我三个小时才弄清楚)不幸的是,我现在一点也不知道该怎么处理它。如何让 GraphViz 加载我的 all.xml 文件并将其转换为图形?
    • @Alex:XML 不是 graphviz 格式。但是 graphviz 格式很简单,你应该使用 XSLT 或任何你最喜欢的 XML 处理语言来生成它(可能不是 C++,脚本语言更适合这种事情)
    • @AlexJansen 您的最终设置是什么?我也在尝试一个非常大的图表。我已经达到了 xml 输出,现在尝试合并为单个 xml,然后转换为 DOT 并在最后使用 graphviz 进行处理。这就是我目前看到的管道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2014-08-02
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2013-02-10
    • 2014-01-15
    相关资源
    最近更新 更多