Visual studio 2019 编译zlib记录

本来编译zlib是很简单的,结果跟着网上一堆乱七八糟的教程走了很多弯路,我觉得有必要发个文章记录一下,希望能给后来的人一点帮助。

多余的步骤就不说了,其实编译zlib根本就不需要命令行,我就纳闷了,分明轻轻松松能点几下鼠标就能搞定的事情,非得又是命令行又是bat的,你能搞定也就算了,结果搞不定还一堆报错。这里以zlib最新版1.2.11作为说明,其他版本自测。

zlib官方网站:
http://www.zlib.net

源码下载地址:

http://www.zlib.net/zlib-1.2.11.tar.gz

下载完成后解压,进入目录 zlib-1.2.11\contrib\vstudio,找到自己Visual Studio所对应的文件夹,我这里用的是Visual studio 2019对应的应该是vc16,但是zlib的最新版本更新时间是January 15, 2017,没有当前VS所对应的版本,所以我们VS选择项目中最新的vc14,然后就是打开我们所熟知的sln工程文件了,这里就让其自动升级一下工程文件版本,正常情况下应该就是正常升级,只会有一些警告,但是没有报错。准备好之后就可以进行下一步。

Visual Studio 6 : vc6
Visual Studio 2003 : vc7
Visual Studio 2005 : vc8
Visual Studio 2008 : vc9
Visual Studio 2010 : vc10
Visual Studio 2012 : vc11
Visual Studio 2013 : vc12
Visual Studio 2015 : vc14
Visual Studio 2017 : vc15
Visual Studio 2019 : vc16

如果现在直接编译,会报错: error LNK2026: 模块对于 SAFESEH 映像是不安全的,网上一搜,也是很多解决方案,如下图:

我试过了,不管用,提示忽略未知选项,怎么试都不行,其实这个问题有两个解决办法,一般我们编译的就是zlib静态库工程名是zlibstat,不是zlibvc,即zlibstat.lib,其他工程对我们来说貌似没有什么用处,所以直接移除就好,SAFESEH只有在链接的时候会用到,所以把其他项目移除之后重新编译,即可在contrib\vstudio\vc14\x86\ZlibStatDebug路径下获得编译好的lib库。

第二个解决方法如下图,理论上应该从这里改,我估计就是参数冲突导致之前的方法不能用的吧:

最后则是cmake编译死活找不到zlib库,设置的环境变量也不识别,只能使用下面的蛮办法了,不过好用就行了。

cmake -DZLIB_LIBRARY:FILEPATH=”C:/path/to/zlib/zlibstat.lib” -DZLIB_INCLUDE_DIR:PATH=”c:/path/to/zlib/zlib-1.2.11″

最后还有一个问题,在使用库的时候可能会出现如下报错:

这几个 无法解析外部符号 _compress2 和 _uncompress 的报错让我一度以为是不是zlib库的引用,或者头文件出现了问题,经过再三确认发现没问题,后来经过查询才知道,32位导出的函数名称与64位导出的函数名称有区别,32位需要在引入前定义ZLIB_WINAPI,真的是坑爹啊,这种问题没有搜索引擎真的是要抓狂。

#define ZLIB_WINAPI
#include <zlib.h>

留下评论