【问题标题】:How to use doxygen to create UML class diagrams from C++ source如何使用 doxygen 从 C++ 源代码创建 UML 类图
【发布时间】:2011-06-12 22:59:24
【问题描述】:

我一直在寻找一些描述如何使用 doxygen 生成简单类图的材料,但找不到。有人可以帮忙吗?

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

如果有更好的工具可以更轻松地实现这一点,请告诉我。

【问题讨论】:

  • 您是否实现了这样的图表,包括有关属性和方法类型的信息?

标签: c++ uml doxygen graphviz class-diagram


【解决方案1】:

嗯,这似乎是一个老问题,但是由于我最近几天一直在搞乱 Doxygen 配置,而我的脑海中仍然充满了当前的信息,让我们试一试 -

我觉得前面的答案差不多了:

缺少的选项是在 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) 图。

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

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

我倾向于讨厌“RTFM”风格的答案,所以对这句话表示歉意,但在这种情况下,Doxygen 文档确实是你的朋友,所以请查看上述设置中的 Doxygen 文档 - 上次我查看时你可以找到http://www.doxygen.nl/manual/config.html的详细信息。

【讨论】:

  • 好答案。在您的回答中,如果“CLASS_GRAPH”,您写的是“CLASS _DIAGRAMS”。
  • 嗯,实际上,现在你提出来了,我知道我有 CLASS_DIAGRAMS = YES 和 CLASS_GRAPH= YES。在检查了 Doxygen 1.8.9.1 的文档后,我发现实际上 CLASS_GRAPH = YES 将覆盖 CLASS_DIAGRAMS = YES ,因此这两个选项交互,CLASS_GRAPH = YES 优先。因此,实际上,就最初的问题而言,我所拥有的将起作用,但还是不错的!
  • 您也可以更改 OUTPUT_DIRECTORY 并允许递归搜索
  • 您可能还需要将 RECURSIVE 字段更改为 YES
  • 这有帮助。但除此之外,可能还需要进行一项更改:使用 DOT_PATH 的完整路径(例如 C:\program files\Graphwiz2.20\bin)。我是从doxygen.10944.n7.nabble.com/… 那里得到的
【解决方案2】:

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

【讨论】:

  • 您将能够浏览整个层次结构,限制在于图表上显示的内容。有几个参数限制了图表的范围。 DOT_GRAPH_NODES 限制单个页面上的条目数,MAX_DOT_GRAPH_DEPTH 限制它的深度。将这些设置为较大的值会使大型项目非常耗时。
  • 谢谢。它对我有用。我还覆盖了 Expert->Dot 中的几个选项
【解决方案3】:

引用this post@(doxygen作者自己写的):

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

    EXTRACT_ALL            = YES
    HAVE_DOT               = YES
    UML_LOOK               = YES

run doxygen again

【讨论】:

  • 这不会生成完整的类图(例如,A 类和 B 类之间的多对一关系);只是一个继承图,即显示超类/子类关系。
【解决方案4】:

Enterprise Architect 将从导入的源代码构建 UML 图。

【讨论】:

  • 赞成还回答了“如果有更好的工具可以更轻松地实现这一点,请告诉我”这个问题。
【解决方案5】:

我认为您需要编辑 doxys 文件并将 GENERATE_UML(类似的东西)设置为 true。并且您需要安装 dot/graphviz。

【讨论】:

  • 你说的是 UML_LOOK 选项吗?
  • @DavidDoria 必须是。但是 UML_LOOK 不会显示任何数据类型。
【解决方案6】:

投票率最高的 2 个答案是正确的。到今天为止,我唯一需要更改(从默认设置)是启用使用点生成而不是内置生成器。

一些重要说明:

  • Doxygen 不会生成项目中所有类的实际完整图表。它将为每个层次结构生成一个单独的图像。如果您有多个不相关的类层次结构,您将获得多个图像。
  • 所有这些图表都可以在html/inherits.html 或(来自网站导航)类 => 类层次结构 =>“转到文本类层次结构”中找到。
  • 这是一个 C++ 问题,所以让我们谈谈模板。特别是如果你继承自 T
    • Doxygen 将正确地将每个模板实例化视为不同的类型。从不同实例继承的类型在图上会有不同的父类。
    • 如果类模板foo 继承自T 并且T 模板类型参数具有默认值,则将采用该默认值。如果有一个从foo<U> 继承的类型bar,其中U 与默认值不同,则bar 将有一个foo<U> 父级。 foo<>bar<U> 不会有共同的父母。
    • 如果有多个类模板至少从它们的一个模板参数继承,只要模板类型参数在代码中具有完全相同的名称,Doxygen 就会为这些类模板假定一个共同的父级。这可以激励命名的一致性。
    • CRTP 和反向 CRTP 都能正常工作。
    • 递归模板继承树未展开。任何variant 实例都将显示为继承自variant<Ts...>
    • 正在绘制没有实例化的类模板。它们的名称中有一个<...> 字符串,表示没有默认值的类型和非类型参数。
    • 类模板完整和部分专业化也正在绘制中。如果特化从不同类型继承,Doxygen 会生成正确的图。

【讨论】:

  • 我的问题是如何创建项目中所有类的实际全图? @Xeverous
  • 我认为这不可能。就像我写的那样,每个层次结构都有 1 个图像。
  • 你的意思是 Doxygen 不可能,还是任何类型的软件都不可能?
  • 前者。如果您找到如何调整 Doxygen 和 dot,您可能会生成非常不同的图像。 IIRC Doxygen 不是严格固定的输入输出软件,dot 几乎可以生成任何类型的图形。
猜你喜欢
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2023-04-05
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多