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

  • 相关阅读:
    ARTS 计划第四周
    ARTS 计划第三周周
    计划表的科学设定
    C/C++内存分配
    ARTS 计划第二周周
    jsoncpp 和 libcurl的编译与使用 vs2010
    ARTS 计划第一周
    unix中的v节点和i节点
    百度地图demo
    带有定位当前位置的百度地图web api 前端代码
  • 原文地址:https://www.cnblogs.com/BensonLaur/p/15967462.html
Copyright © 2020-2023  润新知