1. 程式人生 > 其它 >使用 Visual Studio 編譯 Zint

使用 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主頁地址 原始碼下載地址

zlib主頁地址 原始碼下載地址

libpng主頁地址 原始碼下載地址

作為展示,這裡我下載到的版本: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

選項解釋:MSDN-/Qspectre 解釋1 解釋2

對應警告:編譯器警告 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  和本文原始地址: