VS2015编译zlib库
zlib库下载地址:
http://www.zlib.net/
https://github.com/madler/zlib/releases
版本:zlib-1.2.11
下载的源码已经包含了VS工程的,VS工程在目录:zlib-1.2.11\contrib\vstudio,这里只编译VC14,即VS2015工程
编译好的工程和生成文件放在了git上:https://gitee.com/chenjk10/zlib-VS
编译过程有如下错误:
Win32 Debug报错:
1>match686.obj : error LNK2026: 模块对于 SAFESEH 映像是不安全的。
1>inffas32.obj : error LNK2026: 模块对于 SAFESEH 映像是不安全的。
解决方法:
在“项目属性->链接器->命令行->其他选项(D)”中添加/SAFESEH:NO
或者 在“项目属性->链接器->高级->映像具有安全异常处理程序”将“是(/SAFESEH)”修改为“否(/SAFESEH:NO)”
zlibvc和testzlib两个项目需要添加
x64 Debug编译时会报执行命令失败,实际就是命令错了
解决方法:
x64 Debug zlibvc项目属性->生成事件->预先生成事件->命令行
原命令为:
cd ..\..\contrib\masmx64
bld_ml64.bat
可以直接复制x64 Release的命令行过来,Release的是正确
cd ..\..\masmx64
bld_ml64.bat
编译是完成了,但是使用时发现报错:
error LNK2019: 无法解析的外部符号 _deflate
error LNK2001: 无法解析的外部符号 _deflateEnd
error LNK2019: 无法解析的外部符号 _deflateInit_
error LNK2001: 无法解析的外部符号 _inflateEnd
error LNK2001: 无法解析的外部符号 _inflateInit2_
error LNK2019: 无法解析的外部符号 _inflate
error LNK2019: 无法解析的外部符号 _inflateReset
解决方法:
在使用zlib库的项目的属性-> C/C++-> 预处理器-> 预处理器定义 添加 ZLIB_WINAPI
分析:查看zlib.h头文件的函数声明:
ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
查看声明中的宏定义
ZEXTERN的定义
#ifndef ZEXTERN
# define ZEXTERN extern
#endif
ZEXPORT的定义
# ifdef ZLIB_WINAPI
# ifdef FAR
# undef FAR
# endif
# include <windows.h>
/* No need for _export, use ZLIB.DEF instead. */
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
# define ZEXPORT WINAPI
# ifdef WIN32
# define ZEXPORTVA WINAPIV
# else
# define ZEXPORTVA FAR CDECL
# endif
# endif
或者
#ifndef ZEXPORT
# define ZEXPORT
#endif
由此可以看出只有定义了ZLIB_WINAPI后才会定义#define ZEXPORT WINAPI
查看编译zlib的工程,预处理器定义中都是定义了ZLIB_WINAPI
参考:
https://www.cnblogs.com/MrOuqs/p/5751485.html
https://blog.csdn.net/qq_36881934/article/details/90481009
https://blog.csdn.net/friendan/article/details/40042885