使用 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

 輸出結果:

                         

 5. 附件

如果需要,點擊這裏下載我編譯得到的結果:zint-2.10.0(zlib-1.2.11,libpng-1.6.37)(msvc140).zip

 

6. 參考

zint編譯配置整理

 


 本文原文地址:https://www.cnblogs.com/BensonLaur/p/15967462.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章