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


90

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

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

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


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

Answers:


50

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


6
您将能够浏览整个层次结构,限制是在图表上显示的内容。有几个参数限制了图形的范围。DOT_GRAPH_NODES限制单个页面上的条目数,MAX_DOT_GRAPH_DEPTH限制页面的深度。将这些值设置为较大的值会使大型项目非常耗时。
2011年

谢谢。它为我工作。我还覆盖了Expert-> Dot
tsenapathy

46

引用自这个职位(它是由自己的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

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

39

嗯,这似乎是个老问题了,但是由于最近几天我一直在讨论Doxygen配置,而我的头上仍然充满着当前信息,让我们来刺一下-

我认为先前的答案几乎是这样的:

缺少的选项是COLLABORATION_GRAPH = YES在Doxyfile中添加。我假设您可以在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输出时,图是“可缩放的”,而不是位图格式(如.png)的固定分辨率。显然,如果在IE以外的浏览器中查看输出,则还INTERACTIVE_SVG = YES可以对生成的svg图进行“交互式缩放和平移”。之前我确实尝试过,并且svg的输出在视觉上非常吸引人,但是当时,浏览器对svg的支持仍然有些不一致,因此希望这种情况最近有所改善。

正如其他评论所提到的,其中的某些设置(DOT_GRAPH_MAX_NODES尤其是)确实会对性能产生潜在的影响,因此YMMV。

我倾向于讨厌“ RTFM”样式的答案,因此很抱歉,但是在这种情况下,Doxygen文档确实是您的朋友,因此请查看上述设置上的Doxygen文档-上一次我看一下可以在以下位置找到详细信息http://www.doxygen.nl/manual/config.html


好答案。在您的答案中,您写的是“ CLASS _DIAGRAMS”,而不是“ CLASS_GRAPH”。
DavidS

嗯,实际上,现在您提出来,我看到我既有CLASS_DIAGRAMS = YES又有CLASS_GRAPH = YES。在检查了Doxygen 1.8.9.1的文档之后,我发现实际上CLASS_GRAPH = YES将覆盖CLASS_DIAGRAMS = YES,因此这两个选项会相互影响,而CLASS_GRAPH = YES优先。因此,实际上,出于原始问题的目的,我拥有的东西仍然可以工作,但是很好!
user6092647 '16

您还可以更改OUTPUT_DIRECTORY并允许RECURSIVE搜索
King's jester的小丑

您可能还需要将文件更改RECURSIVE为YES
史前企鹅

6

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


赞成回答“如果有更好的工具可以更轻松地实现这一目标,请告诉我”。
卡韦什

5

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


12
您是否在谈论UML_LOOK选项?
大卫·多里亚

@DavidDoria一定是。但是UML_LOOK将不显示任何数据类型。
Ruud Verhoef

2

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

一些重要的注意事项:

  • Doxygen不会生成项目中所有类的实际完整图。它将为每个层次结构生成一个单独的图像。如果您有多个不相关的类层次结构,则将获得多个图像。
  • 所有这些图都可以在html/inherits.html类=>类层次结构=>“转到文本类层次结构”中找到(或从网站导航中找到)。
  • 这是一个C ++问题,所以让我们谈谈模板。特别是如果您从继承T
    • Doxygen将正确地将每个模板实例视为不同的类型。从不同实例继承的类型在图上将具有不同的父类。
    • 如果类模板foo继承自T并且T模板类型参数具有默认值,则将采用该默认值。如果有一个bar继承自foo<U>where 的类型U不同于默认类型,bar则将有一个foo<U>parent。foo<>并且bar<U>没有共同的父母。
    • 如果有多个类模板至少从其模板参数之一继承,则Doxygen将假定这些类模板具有共同的父代,只要模板类型参数在代码中具有完全相同的名称即可。这激励了命名的一致性。
    • CRTP和反向CRTP都可以。
    • 递归模板继承树不会扩展。variant将显示任何实例以继承variant<Ts...>
    • 没有实例化的类模板正在被绘制。它们<...>的名称中将有一个字符串,表示没有默认值的type和non-type参数。
    • 还绘制了全部和部分专业课程模板。如果专业从不同类型继承,则Doxygen会生成正确的图。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.