前言
学习C++项目,无论是调用的C++库,亦或者查看一个别人的项目,再或者接手一个老项目(shishan),直接硬撸源码是不太现实的。有些库文档写得不好,看文档不如直接看源码了。这个时候,如果我们手上已经有了源码,那使用逆向工程生成一些比较适合阅读的输出文档、图表就是一个自然而然的念头。对于C++来说,doxygen应该是个较为通用的解决方案。
汇总
- doxygen
- visual paradigm
- rational rose
- start uml
visual paradigm: How to generate UML from C++ - Visual Paradigm (visual-paradigm.com)
doxygen: Doxygen + Graphviz + Htmlhelp, 成为文档好手 - maxweii - 博客园 (cnblogs.com)
后面两个在UML领域也比较出名(虽然可能比较菜觉得不太好用)。
都试用一遍,绘图工具主要专注于某种图的生成,最有性价比的选择还是doxygen.
Doxygen生成
使用doxywizard.exe非常傻瓜式,根据向导一步步选择即可。环境安装参考上述一个链接,主要就是下载doxygen, 需要合成chm的再安装个htmlhelp, 图表生成更好看的话增加graphviz。单纯就doxygen就可以。下面是我的一些步骤记录。
关键步骤
- 第一步必填的一些信息,其他信息根据喜好添加。
第二步选择。
- 勾选分析的对象选择All Entity:让Doxygen分析所有内容。因为并不见得所有的代码都按Doxygen的注释方式进行了注释,为保证不会漏掉东西,所以选此项。这就是Doxygen的优势,兼容非doxygen注释(或者根本没有注释)的工程,一样可以看到一些结构信息。
- “Include cross-referenced source code in the output”:简单来说就是把源代码也放到生成的文档中。个人比较喜欢选择这一项,虽然会导致API文档体积增大,但在以后查阅API文档时,可以直接看到源代码,不用专门去打开相应的源代码文件了。
第三步输出。
第四步图表。
Build.
- “FILE_PATTERNS”:告诉Doxygen需要分析哪些文件。这里要注意OSG和osgEarth的头文件都是没有扩展名的,所以这里加了个“*”,以确保Doxygen能扫描到这些头文件。
输入。这里输入的patterns,可在输出完成后,检查有什么信息少的或者不必要的,再回来补充。
Dot。如果勾选了Dot,需指定路径。
同理htmlhelper也是。
可选步骤
图标。在第一步选择icon后在expert张也加上。
不知道为什么在Wizard中设置的logo切换到Expert下就没有了,所以在这里又设置了一次。同样,如果不想在文档中显示图片logo,不填这一项就可以了。
Expert:HTML。
“HTML_DYNAMIC_SECTIONS”:让Doxygen产生可以显示/隐藏的动态块。生成的所有图片初始都是隐藏状态,需要哪个展开来看就是了,个人比较喜欢这个功能。
“CHM_FILE”:指定要生成的chm文档路径及名称。如果不加“../”生成的文件在“Doc/HTML”下,里面文件太多了不好找,加上“../”让Doxygen放到“Doc”下。
“HHC_LOCATION”:告诉Doxygen用于编译chm的工具hhc.exe在哪儿。这个工具是生成CHM的关键,通常在“C:/Program Files/HTML help workshop”路径下,如果没有就到网上找一个。
技巧
- 不想每次都重复一遍选择,每个生成类似的项目,只要拷贝之前生成过的项目的Doxyfile,更改项目路径即可。
(更新)Doxygen+Sphinx
小前言:
仍然是对于一个新项目,对于项目代码理解以及熟悉代码的向新成员讲解过程,结合API、图表和生成的文档会更加清晰。
然后发现微软的HTML help workshop(hhw)软件已经不维护了,安装包也很难找到(本地原本安装好的补充了一个HHA.DLL还能勉强一用)。
既然如此,原本也一直觉得chm这个帮助手册很难看,那寻找一下别的方案。
比较主流的API手册是html组织形式,在左侧导航栏索引API,中间视图显示API具体内容,即一种叫做reStructuredText (reST)的文法。
实现这种效果的一个主流工具是Sphinx。还有Doxysphinx等。
首先要将doxygen读取源文件(.c, .cpp)转化的xml转换为reStructuredText文档使用breathe。最后再使用Exhale, 在 reStructuredText 文档中恢复 Doxygen 的类、文件和页面层次结构。
完整的工具链为:doxygen(提取源文件内容)+breathe(转换为reStructuredText)+exhale(重新组织类结构)+sphinx(组织reStructuredText文档显示)。
Sphinx+breathe+cmake配置参考:
1
2
3
4
# 环境,进入虚拟env
pip install sphinx_rtd_theme
pip install breathe
pip install exhale
Doxygen使用参考上面。区别:output输出xml格式。
Doxygen效果:
1
2
3
4
5
6
7
8
9
10
11
12
13
sphinx-quickstart.exe
# 修改conf.py
...
extensions = [
'breathe', # 用于支持 doxygen
]
# Breathe Configuration
breathe_default_project = 'demo' # breathe 默认项目
breathe_projects = {
'ProxyDoc': 'D:/F/Program/SimCSC/Proxy-Doc/xml' # 配置 demo 项目的 doxygen xml 路径
}
html_theme = 'sphinx_rtd_theme'
sphinx_rtd效果:
可以看到只有索引页,看起来很丑。
可以使用exhale.参考:Documenting C++ with Doxygen and Sphinx - Exhale :: Rohit Goswami — Reflections (rgoswami.me)
1
2
3
# 这里使用Poetry管理依赖
poetry init
poetry add exhale breathe sphinx-book-theme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 修改conf.py
extensions = [
'breathe',
'exhale',
]
#—- Exhale configuration--
# Setup the breathe extension
breathe_projects = {
"My Proj": "./../../xml"
}
breathe_default_project = "My Proj"
# Setup the exhale extension
exhale_args = {
# These arguments are required
"containmentFolder": "./api",
"rootFileName": "library_root.rst",
"rootFileTitle": "Library API",
"doxygenStripFromPath": "..",
# Suggested optional arguments
"createTreeView": True,
# TIP: if using the sphinx-bootstrap-theme, you need
# "treeViewIsBootstrap": True,
}
# Tell sphinx what the primary language being documented is.
primary_domain = 'cpp'
# Tell sphinx what the pygments highlight language should be.
highlight_language = 'cpp'
# 修改index.rst
.. toctree::
:maxdepth: 2
:caption: Contents:
api/library_root
1
make.bat html
坑来了!
这里最大的坑是文件编码问题,测试的项目可能都有GB2312编码的文件(但又不全是!),导致输出的xml文件部分是utf-8格式,部分是ANSI格式。但是这些插件要求必须是utf-8编码的。因此需要转换一下格式。(当然更应该的是项目应该规范化一个编码格式)
寻找non-utf8格式文件:(来源),需类unix终端,git-bash即可。
1
find . -type f | xargs -I {} bash -c "iconv -f utf-8 -t utf-16 {} &>/dev/null || echo {}" > utf8_fail
找到以后逐一修改文件编码,修改方式可通过vs code、Notepad++。批量修改可使用edit plus,打开所有需要修改文件,在工具栏“文档”下->文件编码->批量修改。
之后就可以正常make.bat html
编译完成。效果:
另外可参考别的库的sphinx生成的编写:LimeSuite/conf.py at sphinx · myriadrf/LimeSuite (github.com)。
最终各版本效果对比:
补充:最后测试了一下qhp:
然后在qt creator->工具->帮助->文档->添加,效果:
很丑….