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

128

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

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

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


你是否实现了像这样的图表,包括属性和方法类型的信息? - IzZy
6个回答

82

嗯,这似乎是一个有点陈旧的问题,但由于我最近几天一直在调整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)可能会对性能产生影响,因此结果因人而异。

我通常讨厌“RTFM”风格的回答,对于这句话,我表示歉意,但在这种情况下,Doxygen文档真的是您的好朋友,因此请查看有关上述设置的Doxygen文档-上次我查看时,您可以在http://www.doxygen.nl/manual/config.html找到详细信息。


1
您可以更改 OUTPUT_DIRECTORY 并允许递归搜索。 - user6547518
1
您可能还需要将RECURSIVE字段更改为YES。 - prehistoricpenguin
这很有帮助。但是另外可能需要进行一项更改:使用完整路径来设置DOT_PATH(例如C:\program files\Graphwiz2.20\bin)。我从http://doxygen.10944.n7.nabble.com/I-can-t-generate-class-graph-with-dot-td3461.html获取了这个信息。 - venk
根据需要,所有有用的注释!这些都是原问题中未提及的个人偏好,所以当我说“Doxygen文档确实是你的朋友”时,这些都是我所指的东西,但在这里指出也无妨(依我之见)。 - user6092647
我谷歌了一下并观看了一些视频。我发现Doxygen生成的类图无法修改,它们是JPG和类似格式的图片。 - John
显示剩余3条评论

60

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


6
您可以浏览整个层次结构,但受图表显示的限制。有几个参数限制了图表的范围。DOT_GRAPH_NODES限制单页条目数,MAX_DOT_GRAPH_DEPTH限制深度。将这些设置为大值会使大型项目非常耗时。 - DanS
谢谢。这对我有用。我还在专家->点中覆盖了一些选项。 - tsenapathy

50

以下是此帖子的引用(作者为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

16
这不会生成完整的类图(例如,类A和类B之间的多对一关系);只会生成继承图表,即显示超类/子类关系。 - stepthom

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

因为你还回答了这个问题:“如果有更好的工具可以更轻松地实现这一点,请告诉我。”所以我给你点赞。 - kaveish

6

排名最高的两个答案是正确的。截至今天,我所需要更改的唯一一件事(从默认设置中)就是启用使用dot生成图形,而不是使用内置生成器。

一些重要注意事项:

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

我的问题是如何创建项目中所有类的实际完整图表?@Xeverous - user11623586
我认为这是不可能的。就像我写的那样,每个层次结构只能获得1个图像。 - Xeverous
你的意思是Doxygen不可能实现这个功能,还是任何软件都不可能实现? - user11623586
前者。如果你找到了如何调整Doxygen和dot,你可能会生成非常不同的图像。我记得Doxygen不是严格固定输入输出软件,而dot可以生成几乎任何类型的图形。 - Xeverous

5

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


12
你在谈论 UML_LOOK 选项吗? - David Doria
@DavidDoria 必须是。但是 UML_LOOK 不会显示任何数据类型。 - SomeDutchGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接