編譯和使用zlib
由於要弄一個專案,在windows下用到zlib庫,現成的庫都是release版本的,如果專案是debug的就會導致一大堆符號錯誤,無奈只得自己重新編譯zlib庫。
首先下載 原始碼和工程檔案
解壓到某個目錄
開啟VS2010 的命令列 32bit
進入到zlib-1.2.5\contrib\masmx86目錄
執行bld_ml32.bat
開啟工程專案zlib-1.2.5\contrib\vstudio\vc10\zlibvc.sln
編譯整個solution(包括 debug 和 Release)
此時已經得到了4個檔案 zlibwapi.dll zlibwapi.lib zlibwapid.dll zlibwapid.lib
其中 lib 檔案是連線期間用到的,dll檔案是執行時候用到的。還有兩個標頭檔案 zconf.h zlib.h
是在編譯期間用到。關於lib 和dll 關係和區別可見連結。
把得到的lib檔案放在VS工程目錄下,在 屬性 -> 聯結器 -> 輸入 -> 附加依賴項
一欄裡面把剛才得到的lib檔案加進去,注意末尾帶有 d 的表示debug版。
此時編譯,連結依然有錯:
error LNK2019: 無法解析的外部符號 _compress
在 VS 2010 下通過 dumpbin 命令檢視lib匯出函式 :
dumpbin /exports XXX.lib
可以看到 有compress 的匯出。
ordinal name
1 _adler32@12
140 _adler32_combine@12
39 _compress2@20
2 _compress@16
經過網上查詢,發現是要在vs2010的WIN32環境下加入 ZLIB_WINAPI的巨集定義才行:
#define ZLIB_WINAPI
#include "zconf.h"
注意這個巨集定義要加在 zconf.h 包含之前,如果載入了 zconf.h 之後也不行。
此時編譯一切順利。
相關文章
- Android 編譯 zlibAndroid編譯
- zlib庫編譯過程遇到的問題及其使用zlib庫進行解壓縮編譯
- mingw下編譯zlib quazip動態庫編譯
- 使用 Nginx 編譯 Sass 和 ScssNginx編譯CSS
- 使用ilasm 和 ildasm編譯和反編譯工具對DLL檔案修改ASMLDA編譯
- 使用 Laravel Mix 編譯 JavaScript 和 CSSLaravel編譯JavaScriptCSS
- IJKPlayer視訊直播-編譯和使用編譯
- 使用Reflector和Filedisassembler逆向編譯反編譯.cs.dll檔案程式碼編譯
- 使用makefile編譯編譯
- 開源編譯工具和編譯軟體編譯
- Flink1.9.2原始碼編譯和使用原始碼編譯
- iOS: FFmpeg編譯和使用問題總結iOS編譯
- 編譯器的自展和自舉、交叉編譯編譯
- Android反編譯:反編譯工具和方法Android編譯
- 交叉編譯-Mac環境使用NDK編譯FFmpeg編譯Mac
- 使用xmake編譯工程編譯
- 使用Remix編譯和部署以太坊智慧合約REM編譯
- 淺談彙編器、編譯器和直譯器編譯
- Vue3原始碼分析——編譯模組和編譯器Vue原始碼編譯
- 前端開發模式:被動編譯和主動編譯前端模式編譯
- 使用zlib庫解壓zip檔案
- 編譯靜態庫的方式使用spdlog和fmt編譯
- 交叉編譯和交叉除錯環境搭建及使用編譯除錯
- Go 編譯和工具鏈Go編譯
- Angular–AOT和JIT編譯Angular編譯
- 交叉編譯和 RPC編譯RPC
- nginx的編譯和配置Nginx編譯
- Windows下編譯使用AliyunOSSCSDKWindows編譯
- 使用makefile編譯c程式編譯C程式
- GCC編譯器的使用GC編譯
- 使用C編譯器編寫shellcode編譯
- TDengine 3.0 中如何編譯、建立和使用自定義函式編譯函式
- 在 Windows 中使用 WSL 編譯 Linux 和 U-BootWindows編譯Linuxboot
- 翻譯的未來:翻譯機器和譯後編譯編譯
- Java 編譯期和執行期Java編譯
- keystone和beaengine的編譯編譯
- TIR 的概念和編譯原理編譯原理
- C編譯: 使用gdb除錯編譯除錯