如何使用 doxygen 从 C + + 源代码创建 UML 类图

我一直在寻找一些材料,描述如何生成简单的类图与氧气,但无法找到一个。有人能帮忙吗?

我需要从一组 C + + 文件中创建如下所示的图表。 alt text

如果有更好的工具更容易实现这一点,请让我知道。

137319 次浏览

我认为您需要编辑 doxys 文件并将 GENERATE _ UML (类似的东西)设置为 true。还需要安装 dot/Graphviz。

Dox 创建继承关系图,但我不认为它会创建一个完整的类层次结构。它确实允许您使用 GraphViz 工具。如果您使用 DoxyGUI 前端工具,您将在 Step2: -> Wizard tab -> Diagrams中找到相关的选项。DOT 关系选项在“专家”选项卡下。

Quote from 这篇文章 (it's written by the author of doxygen himself) :

run doxygen -g and change the following options of the generated Doxyfile:


EXTRACT_ALL            = YES
HAVE_DOT               = YES
UML_LOOK               = YES


run doxygen again

企业架构师将从导入的源代码构建一个 UML 图。

Hmm, this seems to be a bit of an old question, but since I've been messing about with Doxygen configuration last few days, while my head's still full of current info let's have a stab at it -

我认为以前的答案几乎已经说明了一切:

缺少的选项是在 Doxyfile 中添加 COLLABORATION_GRAPH = YES。我假设您可以在 doxyWizard GUI 中的某个地方做相同的事情(我不使用 doxyWizard)。

因此,作为一个更完整的例子,与 UML 输出相关的典型的“ Doxyfile”选项是:

EXTRACT_ALL          = YES
CLASS_DIAGRAMS      = YES
HIDE_UNDOC_RELATIONS = NO
HAVE_DOT             = YES
CLASS_GRAPH          = YES
COLLABORATION_GRAPH  = YES
UML_LOOK             = YES
UML_LIMIT_NUM_FIELDS = 50
TEMPLATE_RELATIONS   = YES
DOT_GRAPH_MAX_NODES  = 100
MAX_DOT_GRAPH_DEPTH  = 0
DOT_TRANSPARENT      = YES

这些设置将同时生成“继承”(CLASS_GRAPH=YES)和“协作”(COLLABORATION_GRAPH=YES)图。

根据您的目标“部署”的氧输出,设置 DOT_IMAGE_FORMAT = svg也可能是有用的。使用 svg 输出,图表是“可伸缩的”,而不是位图格式的固定分辨率,例如。砰。显然,如果在 IE 以外的浏览器中查看输出,还有 INTERACTIVE_SVG = YES,它将允许“交互式缩放和平移”生成的 svg 图。我曾经尝试过这样做,svg 的输出在视觉上非常吸引人,但是当时,浏览器对 svg 的支持仍然有点不一致,所以希望最近这种情况有所改善。

正如其他评论所提到的,其中一些设置(特别是 DOT_GRAPH_MAX_NODES)确实有潜在的性能影响,因此 YMMV。

我讨厌“ RTFM”风格的回答,所以很抱歉这样说,但是在这种情况下,Doxydocs 确实是你的朋友,所以查看上面提到的设置中的 Doxydocs-上次我查看的时候,你可以在 http://www.doxygen.nl/manual/config.html找到详细信息。

The 2 highest upvoted answers are correct. As of today, 我唯一需要改变的(从默认设置)是启用使用点生成 instead of the built-in generator.

一些重要的注意事项:

  • Dox 不会生成项目中所有类的实际完整图表。它将为每个层次结构生成一个单独的图像。如果您有多个不相关的类层次结构,您将获得多个图像。
  • 所有这些图都可以在 html/inherits.html或(来自网站导航) class = > class HP = > “ Go to the text class HP”中找到。
  • 这是一个 C + + 的问题,所以让我们来讨论一下模板,特别是从 T继承的模板。
    • 每个模板实例化都将被 Doxyx 正确地认为是一个不同的类型。从不同瞬间继承的类型在关系图上将有不同的父类。
    • 如果类模板 fooT继承而来,并且 T模板类型参数具有默认值,那么将假定这种默认值。如果有一个从 foo<U>继承的类型 bar,其中 U与默认值不同,那么 bar将有一个 foo<U>父类。foo<>bar<U>不会有一个共同的父母。
    • 如果有多个继承自至少一个模板参数的类模板,那么只要模板类型参数在代码中具有完全相同的名称,Doxy就会假定这些类模板具有共同的父类。这激励了命名的一致性。
    • CRTP 和反向 CRTP 都有用。
    • 递归模板继承树不会展开。任何 variant实例都将显示为从 variant<Ts...>继承。
    • 正在绘制没有实例化的类模板。它们的名称中有一个 <...>字符串,表示没有默认值的类型和非类型参数。
    • 类模板的完整和部分专门化也正在绘制中。如果专门化继承自不同的类型,Doxo 会生成正确的图。