繁体   English   中英

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

[英]How to use doxygen to create UML class diagrams from C++ source

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

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

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

嗯,这似乎是一个老问题,但是由于我最近几天一直在搞乱 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 的支持仍然有点不一致,所以希望这种情况最近可能有所改善。

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

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

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

引用这篇文章(它是由 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

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

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

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

一些重要的注意事项:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM