VS2015編譯zlib庫

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  

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