使用Sphinx-apidoc从C++代码生成文档

25

以前有一些帖子谈论过这个话题,声称Sphinx根本不支持这个。我有些怀疑,但它可能已经更新了,或者文档被很好地隐藏起来了,因为这里有一个链接表明了相反的情况: http://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#cpp-domain

无论如何,我刚接触Sphinx并尝试使用它来(最终)自动化文档,使用一些源自C++代码的文本。到目前为止,当使用sphinx-apidoc -o ...命令时,几乎创建了一个空白文档。我可能没有使用正确的指令,因为我不知道该怎么用——支持文档没有能够帮助我。

是否有人可以提供一些基本步骤来使其工作?如果无法从C++自动生成文档,那么C++域是用来做什么的,如何使用它们?

1个回答

44

关于自动生成C++文档:

在阅读了如何使用sphinx之后,你应该看看breathe

Breathe提供了Sphinx和Doxygen文档系统之间的桥梁。

它是一种将Doxygen信息包含在由Sphinx生成的一组文档中的简单方法。目标是为那些喜欢使用Sphinx但使用除Python以外的语言的人们提供一个类似于autodoc的支持。该系统依赖于Doxygen的xml输出。

因此,您还需要遵循Doxygen的注释格式,甚至设置一个Doxygen项目。但我尝试过这个方法,虽然最初的设置需要花费点时间,但实际上效果非常好。下面是我们的CMakeLists.txt的摘录,这可能会给你一个关于Sphinx和Doxygen如何协同工作的想法:

macro(add_sphinx_target TARGET_NAME BUILDER COMMENT_STR)
    add_custom_target(${TARGET_NAME}
    COMMAND sphinx-build -b ${BUILDER} . sphinx/build/${BUILDER}
        WORKING_DIRECTORY docs
        DEPENDS doxygen
        COMMENT ${COMMENT_STR}
    )

endmacro(add_sphinx_target)

add_custom_target(doxygen
    COMMAND doxygen docs/doxygen.conf
    COMMENT "Build doxygen xml files used by sphinx/breathe."
)

add_sphinx_target(docs-html
    html
    "Build html documentation"
)

在初始设置后,实际上归结为以下几点:

  1. 使用 doxygen path/to/config 生成 Doxygen 文档。
  2. cd 到包含 Sphinx 配置文件的目录。
  3. 使用 sphinx-build . path/to/output 生成 Sphinx 文档。

关于 C++ 领域:

Sphinx 不仅是一个自动生成文档系统。我建议你看看 示例 (并考虑到Sphinx官网是由Sphinx reST代码编写而成)。尤其是单击许多Sphinx生成页面上的 Show Source 链接。

如果无法自动为项目生成文档,则必须手动编写文档。基本上,Sphinx 是一个将 reST 编译为任何格式(如 LaTeX、HTML)的编译器。因此,你可以编写任意文本,但优点在于它具有大量指令,用于记录不同语言的源代码。每种语言都有自己的领域(前缀或命名空间),以分隔不同语言的命名空间。例如,可以使用以下方式记录 Python 函数:

.. py:function:: Timer.repeat([repeat=3[, number=1000000]])
    Does something nasty with timers in repetition

(来源)

我可以使用cpp域来做同样的事情:

.. cpp:function:: bool namespaced::theclass::method(int arg1, std::string arg2)

   Describes a method with parameters and types.

(来源)

如果您想使用Sphinx而不是Doxygen+Breathe来记录您的C++项目,那么您将需要自己编写重新组织的文本文件。这也意味着您将文档与源代码分开,这可能是不理想的。

我希望这能帮助您了解一些情况。为了进一步阅读,我强烈建议您详细阅读Sphinx教程文档,直到您真正理解它所做的事情。


如果你查看我在Sphinx网站上发布的链接(http://sphinx.pocoo.org/latest/domains.html),它会说明从C++代码中提取信息是可能的(只要你将域更改为“cpp”,而不是“py”)。甚至还提供了您可以使用的指令的描述。我遇到的问题是我不知道如何正确使用它们。 - user1488804
不,不是这样的。这指的是在同一个项目中使用多种语言的可能性,并通过使用sphinx/reST域来正确分离语言的命名空间。所谓的“不同”实际上是指“同一个项目中使用多种不同的语言”,而不是“与Python不同的语言”。抱歉。 - Jonas Schäfer
但是这些不同的语言指的是C++、Java等。那么为什么这会阻止您使用Sphinx从C++代码生成文档呢?我的意思是,如果它不能生成文档,那么您要用这些指令做什么? - user1488804
1
你可以创建文档,但不能自动化(例如使用Sphinx读取源代码并以“autodoc”方式创建文档)。如果您不想使用Breathe,即从源代码中分离出带有reST命令的.rst文件手动编写文档。 - Jonas Schäfer
1
我以前甚至没有见过这些指令,不幸的是我发现很难理解它们。如果你觉得我没能理解让你感到沮丧,我很抱歉,但我很感激你的坚持。关于你在初始回复编辑中的那句话(特别是c++指令块后面的段落),你写文档是什么意思?你是说1. 你有一个源c++文件。2. 你编写一个单独的reST标记文件,其中包含所有指令和其他文本。 - user1488804
显示剩余13条评论

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