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

posted @ 2022-03-05 14:26  BensonLaur  阅读(1027)  评论(0编辑  收藏  举报