【Visual Leak Detector】原始碼編譯 VLD 庫

木三百川發表於2023-04-24

說明

使用 VLD 記憶體洩漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 原始碼的編譯。同系列文章目錄可見 《記憶體洩漏檢測工具》目錄


1. VLD 庫的依賴檔案

vld2.5.1 版本為例,下載原始碼 後,原始碼包中各檔案的用途可看本人另一篇部落格 【VLD】原始碼檔案概覽。使用 vld2.5.1-setup.exe 安裝 VLD 時(可參考 【VLD】安裝 VLD),安裝目錄結構如下:

D:\Program Files (x86)\Visual Leak Detector
│  AUTHORS.txt
│  CHANGES.txt
│  COPYING.txt
│  unins000.dat
│  unins000.exe
│  vld.ini
│
├─bin
│  ├─Win32
│  │      dbghelp.dll
│  │      Microsoft.DTfW.DHL.manifest
│  │      vld_x86.dll
│  │      vld_x86.pdb
│  │
│  └─Win64
│          dbghelp.dll
│          Microsoft.DTfW.DHL.manifest
│          vld_x64.dll
│          vld_x64.pdb
│
├─include
│      vld.h
│      vld_def.h
│
└─lib
    ├─Win32
    │      vld.lib
    │
    └─Win64
            vld.lib

除了 unins000.datunins000.exe 外,一共 16 個檔案。檢視原始碼包中的檔案 .\setup\vld-setup.iss 第 44~59 行,可知這 16 個檔案的來源:

[Files]
Source: "dbghelp\x64\dbghelp.dll"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion
Source: "dbghelp\x64\Microsoft.DTfW.DHL.manifest"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion
Source: "dbghelp\x86\dbghelp.dll"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion
Source: "dbghelp\x86\Microsoft.DTfW.DHL.manifest"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion
Source: "..\src\bin\Win32\Release-v140\vld.lib"; DestDir: "{app}\lib\Win32"; Flags: ignoreversion
Source: "..\src\bin\Win32\Release-v140\vld_x86.dll"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion
Source: "..\src\bin\Win32\Release-v140\vld_x86.pdb"; DestDir: "{app}\bin\Win32"; Flags: ignoreversion
Source: "..\src\bin\x64\Release-v140\vld.lib"; DestDir: "{app}\lib\Win64"; Flags: ignoreversion
Source: "..\src\bin\x64\Release-v140\vld_x64.dll"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion
Source: "..\src\bin\x64\Release-v140\vld_x64.pdb"; DestDir: "{app}\bin\Win64"; Flags: ignoreversion
Source: "..\src\vld.h"; DestDir: "{app}\include"; Flags: ignoreversion
Source: "..\src\vld_def.h"; DestDir: "{app}\include"; Flags: ignoreversion
Source: "..\vld.ini"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\AUTHORS.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\CHANGES.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\COPYING.txt"; DestDir: "{app}"; Flags: ignoreversion
  • 【檔案 1】安裝目錄檔案 AUTHORS.txt 來自於原始碼根目錄下同名檔案。
  • 【檔案 2】安裝目錄檔案 CHANGES.txt 來自於原始碼根目錄下同名檔案。
  • 【檔案 3】安裝目錄檔案 COPYING.txt 來自於原始碼根目錄下同名檔案。
  • 【檔案 4】安裝目錄檔案 vld.ini 來自於原始碼根目錄下同名檔案。
  • 【檔案 5】安裝目錄檔案 .\include\vld.h 來自於原始碼目錄 .\src 下同名檔案。
  • 【檔案 6】安裝目錄檔案 .\include\vld_def.h 來自於原始碼目錄 .\src 下同名檔案。
  • 【檔案 7】安裝目錄檔案 .\bin\Win64\dbghelp.dll 來自於原始碼目錄 .\setup\dbghelp\x64 下同名檔案。
  • 【檔案 8】安裝目錄檔案 .\bin\Win64\Microsoft.DTfW.DHL.manifest 來自於原始碼目錄 .\setup\dbghelp\x64 下同名檔案。
  • 【檔案 9】安裝目錄檔案 .\bin\Win32\dbghelp.dll 來自於原始碼目錄 .\setup\dbghelp\x86 下同名檔案。
  • 【檔案 10】安裝目錄檔案 .\bin\Win32\Microsoft.DTfW.DHL.manifest 來自於原始碼目錄 .\setup\dbghelp\x86 下同名檔案。
  • 【檔案 11】安裝目錄檔案 .\bin\Win64\vld_x64.dllVisual Studio 2015Releasex64 模式編譯原始碼生成。
  • 【檔案 12】安裝目錄檔案 .\bin\Win64\vld_x64.pdbVisual Studio 2015Releasex64 模式編譯原始碼生成。
  • 【檔案 13】安裝目錄檔案 .\lib\Win64\vld.libVisual Studio 2015Releasex64 模式編譯原始碼生成。
  • 【檔案 14】安裝目錄檔案 .\bin\Win32\vld_x86.dllVisual Studio 2015ReleaseWin32 模式編譯原始碼生成。
  • 【檔案 15】安裝目錄檔案 .\bin\Win32\vld_x86.pdbVisual Studio 2015ReleaseWin32 模式編譯原始碼生成。
  • 【檔案 16】安裝目錄檔案 .\lib\Win32\vld.libVisual Studio 2015ReleaseWin32 模式編譯原始碼生成。

2. 原始碼編譯生成 VLD 庫

使用 Visual Studio 2015 開啟原始碼根目錄下的 vld_vs14.sln 或者 vld_vs14_wo_mfc.sln,當僅用於生成 VLD 庫時,這兩個解決方案的生成結果是一樣的,詳見本人另一篇部落格 【VLD】原始碼檔案概覽。開啟後,下拉構建配置框,可以看到有 6 種配置可供選擇:DebugDebug_StaticCrtDebug_VldReleaseDebug_VldRelease_StaticCrtReleaseRelease_StaticCrt,他們的區別在於連結的執行庫版本不同(詳見 專案屬性 -> C/C++ -> 程式碼生成 -> 執行庫),以及是否啟用最佳化。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

開啟 配置管理器,下拉檢視不同的 活動解決方案配置,發現除 DebugDebug_StaticCrt 模式外,其餘 4 種配置下 vld 的配置都為 Release。因此解決方案的配置選項選擇除 DebugDebug_StaticCrt 外的 4 種都可以,不妨選擇 Release

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

按下圖步驟操作,生成 Win32 平臺下的 VLD 庫及 pdb 檔案。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

同樣地,按下圖步驟操作,生成 Win64 平臺下的 VLD 庫及 pdb 檔案。

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

在生成目錄 .\src\bin\Win32\Release-v140 下可以找到對應的 3 個檔案:

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

同樣地,在生成目錄 .\src\bin\x64\Release-v140 下可以找到 Win64 平臺的 3 個檔案:

Oh Shit!-圖片走丟了-打個廣告-歡迎來部落格園關注“木三百川”

至此,VLD 安裝目錄下的 16 個檔案已經全部具備,可以開始使用了。

3. 配置環境變數

由於沒有使用 vld2.5.1-setup.exe 安裝器,環境變數還需要自己來手動配置,將以上 16 個檔案整理到一個目錄下,最好依據前面的安裝目錄結構來進行整理,然後手動修改系統變數 Path,增加對應的 Win32 版本路徑與 Win64 版本路徑,例如:

D:\Program Files (x86)\Visual Leak Detector\bin\Win32
D:\Program Files (x86)\Visual Leak Detector\bin\Win64

4. 使用 VLD 庫

VLD 庫的使用方式可參考本人同系列文章:

  • 在 VS 2015 中使用 VLD
  • 在 QT 中使用 VLD(方式一)。這一種使用方式的缺點是,當把專案複製到別的電腦上編譯執行時,需要按特定流程重新配置 VLD 環境。但優點是在一臺電腦上配置完成後,用的時候十分方便,包含標頭檔案就可以使用,不需新增任何多餘的程式碼。
  • 在 QT 中使用 VLD(方式二)。這一種使用方式的特點是,在一臺電腦上安裝完成後,需在專案 pro 檔案中指明庫及標頭檔案的路徑,然後在 mian.cpp 檔案中 #include "vld.h"。當把專案複製到別的電腦上編譯執行時,需要確保該電腦已經具備了 VLD 環境,並更改專案 pro 檔案中指明的相關路徑。
  • 在 QT 中使用 VLD(方式三)。這一種使用方式的特點是,在一臺電腦上安裝完成後,將 VLD 安裝目錄下的 lib 庫及 include 檔案複製到專案目錄中,在專案 pro 檔案中指明庫及標頭檔案的路徑,並將 vld.ini 檔案和 VLD 安裝目錄 bin 資料夾下的全部檔案複製到專案生成目錄下,最後在 mian.cpp 檔案中 #include "vld.h"。優點是,當把專案複製到別的電腦上編譯執行時,該電腦無需安裝 VLD,也不需要更改任何程式碼。

相關文章