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),沒什麼作用

 

 

 

 

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