在项目里用到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
期间,还有些小错误:
解决方法: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到上级目录