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