專欄導讀
本專欄第一篇文章「專欄開篇」列出了專欄的完整目錄,按目錄順序閱讀,有助於你的理解。
前言
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
