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

时间:2011-01-21 06:07:38

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

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

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

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

6 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:40)

引自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

答案 2 :(得分:29)

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

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

缺少的选项是在Doxyfile中添加COLLABORATION_GRAPH = YES。我假设你可以在doxywizard GUI中的某个地方做同样的事情(我不会使用doxywizard)。

因此,作为一个更完整的例子,典型的" Doxyfile"与我倾向于使用的UML输出相关的选项是:

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找到详细信息。 / p>

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

答案 5 :(得分:2)

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

一些重要说明:

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