在項目裏用到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),沒什麼作用