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

dev*_*ull 78 c++ uml doxygen class-diagram graphviz

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

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

如果有更好的工具来实现这一目标,请告诉我.

DPD*_*DPD 48

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

  • 您将能够导航整个层次结构,限制是在图表上显示的内容.有几个参数限制了图表的范围.DOT_GRAPH_NODES限制单个页面上的条目数,MAX_DOT_GRAPH_DEPTH限制它的深度.将这些设置为较大的值会使大型项目非常耗时. (6认同)

ave*_*age 41

引用这篇文章(由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
Run Code Online (Sandbox Code Playgroud)

  • 这不会生成完整的类图(例如,A类和B类之间的多对一关系); 只有一个继承图,即显示超类/子类关系. (10认同)

use*_*647 36

嗯,这似乎是一个古老的问题,但是因为我过去几天一直在搞乱Doxygen配置,而我的头仍然充满了当前的信息让我们有一个刺 -

我认为以前的答案几乎有它:

缺少的选项是添加COLLABORATION_GRAPH = YESDoxyfile.我假设你可以在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
Run Code Online (Sandbox Code Playgroud)

这些设置将生成"继承"(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.stack.nl/~dimitri/doxygen/manual/config.html.


zoo*_*opa 7

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


Xev*_*ous 6

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

一些重要的注意事项:

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


fzh*_*hou 5

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

  • 你在谈论 UML_LOOK 选项吗? (12认同)