使用 Visual Studio 編譯 Zint
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
輸出結果:
本文原文地址:https://www.cnblogs.com/BensonLaur/p/15967462.html
版權宣告 本部落格所有的原創文章,作者皆保留版權。轉載必須包含本宣告,保持本文完整,並以超連結形式註明作者 BensonLaur 和本文原始地址: |