专栏导读
本专栏第一篇文章「专栏开篇」列出了专栏的完整目录,按目录顺序阅读,有助于你的理解。
前言
doxygen 也可以生成函数调用关系图,但 doxygen 能做的远不止于此,它是一款优秀的文档自动生成工具。它可以将代码中的注释转换成帮助文档(注释格式要符合 doxygen 要求才行,FFmpeg API Documentation 就是用doxygen自动生成的),它也可以通过静态分析代码,生成「头文件引用关系图」、「函数调用关系图」、「继承图」以及「协作图」来可视化文档之间的关系。
根据官网介绍,截止书稿,它能支持的语言有:C, C++, Objective-C, C#, PHP, Java, Python, IDL (Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL等。生成的帮助文档格式可以是CHM、RTF、PostScript、PDF、HTML和Unixman page等。
有了这样的工具,在发布程序版本的同时,发布帮助文档也将变得简单、高效,配合持续集成系统(如Jenkins),自动构建系统,帮助文档可以跟随代码一起实时、轻松的发布版本。
doxygen 是跨平台的工具,支持Linux、Windows、Mac OS X系统,本文将以Windows版本为例,简要介绍如何使用 doxygen 生成函数调用关系图,其他功能(如将代码的注释生成帮助文档)不在本文讨论范围内,这是一个入门级的教程。
安装graphviz
跟前面文章介绍的cflow、codeviz一样,doxygen 自身没办法生成关系图,需要依赖 graphviz 才行,所以还得安装 graphviz 先。
官网:http://www.graphviz.org/
下载:https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi
在官网上很容易找到 Windows 平台的 Stable 最新版本,如下图所示,我下载的版本是「graphviz-2.38.msi」,安装过程一直“Next”即可。
图 2-1 选择Stable版本下载graphviz
安装doxygen
官网:http://www.doxygen.nl/
下载:ftp://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.14-setup.exe
在官网上很容易找到最新版本的安装文件,我下载的版本是「doxygen-1.8.14-setup.exe」,安装过程也是傻瓜式的“Next”。
开始之前
截取 doxygen 安装目录树(只是部分),如下所示:
doxygen
├── bin
│ ├── doxygen.exe <-- 最核心的可执行文件
│ └── doxywizard.exe <-- 配置文件向导
└── doxygen_manual.chm <-- 离线帮助手册
其中 doxygen_manual.chm 是离线帮助手册(要深入研究 doxygen 的,认真研读这个手册就对了), doxywizard.exe 是配置文件向导,通过这个向导可以快捷地生成配置文件,doxygen.exe 再根据配置文件分析源码,输出各种图和文档。以下这张图更能直观的表达出 doxywizard.exe 和 doxygen.exe 之间的关系:
图 4-1 doxygen工作原理图
下文将以分析 E:\whoami\whoami.c 源码为例,演示如何使用 doxygen,源文件 whoami.c 内容如下:
/* whoami.c - a simple implementation of whoami utility */
#include <pwd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int who_am_i(void)
{
struct passwd *pw;
char *user = NULL;
pw = getpwuid (geteuid ());
if (pw)
user = pw->pw_name;
else if ((user = getenv ("USER")) == NULL)
{
fprintf (stderr, "I don't know!\n");
return 1;
}
printf ("%s\n", user);
return 0;
}
int main(int argc, char **argv)
{
if (argc > 1)
{
fprintf (stderr, "usage: whoami\n");
return 1;
}
return who_am_i ();
}
创建doxygen配置文件
Doxywizard是配置和运行doxygen的GUI前端,启动 doxywizard.exe 向导可以快捷的创建配置文件。
Step1:运行 doxywizard.exe,点击 Wizard 选项卡,配置 Wizard > Project 页面,如下图所示:
图 5-1 doxywizard 向导步骤1
注意:在使用 doxywizard 的过程发现一个bug,但凡是设置路径的(如待分析的源码路径),都要通过Select按钮启动文本对话框去选择路径,直接拷贝路径到编辑框是不生效的。可以通过 File > Save 保存配置文件去查看,或者直接在 Run > Show configuration 查看,待分析的源码路径的关键词是INPUT。
Step2:点击 Expert 选项卡,配置 Expert > Project 页面:
图 5-2 doxywizard 向导步骤2
Step3:配置 Expert > Build页面:
图 5-3 doxywizard 向导步骤3
Step4:配置 Expert > Dot页面:
图 5-4 doxywizard 向导步骤4
至此,配置完毕,可以通过 File > Save 菜单将上面所有配置导出(保存)到配置文件,以免丢失配置,配置文件默认保存在 Step1 设置的工作目录下。当然你也可以通过 File > Open 菜单导入(打开)一个现有的配置文件。可以打开配置文件看看,里面参数非常多,doxywizard 图形化的便捷性也就体现在这里,没了这个向导,就要人为手工编辑这个配置文件,可想而知那是多么的痛苦。
开始分析源码
上一章节已经配置好了参数,接下来就可以开始分析源码了。切换到 doxywizard.exe 向导的 Run 选项卡,点击 Run doxygen 按钮,幕后就会根据刚才的配置执行 doxygen.exe 命令:
图 6-1 开始分析源码
等分析完毕,最后点击 Show HTML output 按钮就会启动浏览器显示分析结果,如下图所示:
图 6-2 查看doxygen分析后的结果
选择 文件 > 文件列表 > whoami.c 页面,就可以看到「头文件包含关系图」和「函数调用关系图」:
图 6-3 头文件包含关系图
图 6-4 函数调用关系图
从图中可以发现,同样的示例代码,cflow 分析的函数条用关系图会显示系统API(如printf),而doxygen则不会显示系统API(这更符合我们的需求)。由于我的示例源码很简单,所以函数调用关系图看起来也很「简陋」。为了体现doxygen的强大性,我特意选了一个相对复杂点的源码(ffmpeg, 下载地址)来分析:
图 6-5 doxygen分析复杂点的函数关系图
总结
比起doxygen,之前两篇文章所体验的cflow、codeviz简直弱爆了,doxygen安装过程简单,使用便捷,容易上手,用户体验较好。
参考:https://blog.csdn.net/benkaoya/article/details/79763668?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-5.pc_relevant_default&utm_relevant_index=10