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  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章