1導讀 |
本文將展示從下載當前(2022年3月5日)最新版本的 Zint 及其依賴庫 libpng 和 zlib 的源碼到最終使用 Visual Studio 2019(2015) 編譯得到 zint.dll 和 zint.lib 的全過程。在記錄步驟的同時,也會記錄一下在這個過程中遇到的部分問題和其解決方案,希望能對可能需要的人提供參考。 Zint 項目中提供了 Visual Studio 的解決方案(Solution),這使其對於熟悉 Visual Studio 開發的人員十分簡單友好,相信你看完這篇文章也能夠清楚地體會到這一點。 |
1. 下載源碼
作爲展示,這裏我下載到的版本:Zint(2.10.0) zlib(1.2.11) libpng(1.6.37)
2. 先編譯 libpng 和 zlib
2.1 解壓源代碼,恰當地放置文件夾
爲了文件夾位置關係清晰,這裏新建一個文件夾 Workspace(名稱隨意),用於放置所有源代碼
如上圖所示,Zint 解壓後將代碼所在的根目錄直接放置在 Workspace 下(Zint 文件夾名稱也無所謂)
而對於 libpng 和 zlib 的源碼名稱則有要求,將其分別命名爲 lpng 和 zlib 放置在和 Zint 源碼同目錄(這是待會項目中引用的相對位置)
2.2 libpng 已爲我們提供了方便的 VS 解決方案
打開 /lpng/projects/vstudio/vstodio.sln,因爲我使用 VS 2019 打開這個 VS 2010 的項目,所以會提示重新配置 SDK 和 平臺工具集。根據自己的需要自行選擇即可
這是我最終的選擇的配置:
2.3 開始編譯 libpng 和 zlib
打開項目可以看到,該項目已經提供了各種配置:有 Library 的是生成 lib 靜態庫
也可以看到,zlib 項目被設置爲 libpng 的依賴,所以我們直接編譯 libpng
2.4 解決編譯錯誤問題
2.4.1 報錯1:zlib: error C2220: warning treated as error - no 'object' file generated
錯誤分析: warning treated as error
(1)直接原因是設置了 Treat Warnings As Errors (參考)
(2)間接原因自然是有 Warning
2.1)no 'object' file generated
這個並不是直接的 warning,這個說法確實讓人聽了很奇怪,正如 StackOverflow 相關問題 ”C++ no 'object' file generated“ 裏回答者aampere說的那樣:
The real source of the confusion is that Microsoft Visual Studio lists the error C2220: warning treated as error - no 'object' file generated
這個說法引起了誤解
2.2) warning C5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
這個纔是真正觸發錯誤的 warning
A. 關於 Spectre mitigation(幽靈緩解)
Spectre緩解按百度的說法就是 一種硬件漏洞的軟件規避方法 (參考)
B. 關於 /Qspectre
對應警告:編譯器警告 C5045
(3)解決 Warning
暫時沒有搞清楚這個 warning 的來龍去脈,不過似乎忽略也沒關係,這裏有兩種忽略方式
法一:保留 Warning ,然後不將Warning視爲錯誤
法二:忽略指定 Warning:5045
這裏我選擇法二,忽略該警告 5045
2.4.2 報錯2: libpng: error C2220: warning treated as error - no 'executable' file generated
解決方法同上
2.5 編譯得到最終結果
3. 最後編譯 Zint
3.1 同樣已經有 vs 項目,打開項目配置自己需要的平臺工具集
打開解決方案 zint-2.xx.x-src/win32/zint.sln
和上面打開 libpng 的解決方案一樣,自行配置 SDK 和 平臺工具集
3.2 頭文件已經被正確地鏈接
可以看到,libzint 項目配置的頭文件 include 路徑,已經指定到了剛剛我們準備的 zlib 和 lpng 文件夾下,
而且在相關的頭文件也能夠被正確的鏈接
3.3 開始編譯,報錯:無法打開 libpng16_static.lib
3.4 查看引用的庫的配置
按項目配置中的預期,應該是希望引用 libpng/build/Release/libpng16_static.lib, 以及 lib/zlib.lib。很明顯,我們現在在這兩個位置沒有對應的 lib 文件
3.5 正確準備 lib 文件和配置引用路徑
這裏我們的庫的文件名和路徑都和其配置的不一樣,直接新建文件夾 "zlib+lpng", 將兩個引用的lib文件(Realse Library 下的靜態庫文件)複製並重命名 libpng16.lib 爲 libpng16_static.lib
同時,在 libzint 項目裏的額外庫目錄裏,添加我們新增的文件夾的相對路徑 ..\..\zlib_lpng;
3.6 成功編譯構建
經過上面的操作,重新編譯 zint (該項目已經依賴 libzint 項目)
編譯成功後,即可得到 zint.dll 和 zint.lib 庫文件
4. 運行 zint.exe 進行最後驗證
zint 項目會生成 zint.exe 命令行測試程序,從命令行進入 zint.exe 所在目錄。
根據命令提示設置需要測試的參數:
比如這裏, 測試生成一個內容爲 “https://www.cnblogs.com/BensonLaur/p/15967462.html” ,圖片格式爲 emf 的二維碼:
zint.exe --data=https://www.cnblogs.com/BensonLaur/p/15967462.html --barcode=58 --scale=2 --filetype=emf
輸出結果:
5. 附件
如果需要,點擊這裏下載我編譯得到的結果:zint-2.10.0(zlib-1.2.11,libpng-1.6.37)(msvc140).zip
6. 參考