zlib 静态库编译问题

在项目里用到minizip和 zlib 静态库, zlib 用 1.2.11版本(https://github.com/madler/zlib/archive/v1.2.11.zip)编译。

导入后报错如下。

1>minizip.lib(mz_crypt.obj) : error LNK2019: 无法解析的外部符号 _crc32,该符号在函数 _mz_crypt_crc32_update 中被引用
1>minizip.lib(mz_strm_zlib.obj) : error LNK2019: 无法解析的外部符号 _deflate,该符号在函数 _mz_stream_zlib_deflate 中被引用
1>minizip.lib(mz_strm_zlib.obj) : error LNK2019: 无法解析的外部符号 _deflateEnd,该符号在函数 _mz_stream_zlib_close 中被引用
1>minizip.lib(mz_strm_zlib.obj) : error LNK2019: 无法解析的外部符号 _inflate,该符号在函数 _mz_stream_zlib_read 中被引用
1>minizip.lib(mz_strm_zlib.obj) : error LNK2019: 无法解析的外部符号 _inflateEnd,该符号在函数 _mz_stream_zlib_close 中被引用
1>minizip.lib(mz_strm_zlib.obj) : error LNK2019: 无法解析的外部符号 _deflateInit2_,该符号在函数 _mz_stream_zlib_open 中被引用
1>minizip.lib(mz_strm_zlib.obj) : error LNK2019: 无法解析的外部符号 _inflateInit2_,该符号在函数 _mz_stream_zlib_open 中被引用

但从网上找的编译好的 zlib1.2.5或1.2.8都是没问题的。于是开始怀疑 ZEXPORT定义。

zconf.h 中ZEXPORT定义上面有一段注释:“use WINAPI, not __stdcall”。

     /* No need for _export, use ZLIB.DEF instead. */
     /* For complete Windows compatibility, use WINAPI, not __stdcall. */
#      define ZEXPORT WINAPI

但在 minwindef.h 中 WINAPI 定义为 __stdcall ,貌似预期和MSV定义不同。

#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
#define WINAPIV     __cdecl
#define APIENTRY    WINAPI
#define APIPRIVATE  __stdcall
#define PASCAL      __stdcall

于是改为如下定义,重新编译静态库。导入工程后编译成功。

#      ifdef ZLIB_INTERNAL
#	     define ZEXPORT WINAPIV
#      else
#	     define ZEXPORT WINAPI
#      endif

但这造成了动态库编译错误,所以再加一个判定条件( _WINDLL)

#      if !defined _WINDLL && defined ZLIB_INTERNAL
#	     define ZEXPORT WINAPIV
#      else
#	     define ZEXPORT WINAPI
#      endif

期间,还有些小错误:

SAFESEH 映像是不安全的

解决方法:https://blog.csdn.net/zengraoli/article/details/11919307

1.打开该项目的“属性页”对话框。

2.单击“链接器”文件夹。

3.单击“命令行”属性页。

4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击“应用”。

bld_ml64.bat 调用失败

试过 Microsoft Macro Assembler 8.0 (MASM) Package (x86),没什么作用

需要复制contribute目录下的 masm64到上级目录

 

 

 

 

你可能感兴趣的:(MFC,zlib,编译)