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. 参考