欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VS2015编译zlib库

程序员文章站 2022-06-17 14:33:35
...

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  

相关标签: VS2015 zlib x64