2010-11-12 137 views
7

我似乎無法讓zlib在windows下對mingw執行任何操作。在windows下使用zlib mingw

我下載了zlib @http://sourceforge.net/projects/mingw/files_beta/MinGW/zlib/zlib-1.2.3-1-mingw32/,並將頭文件和lib文件放在正確的位置。

簡單的代碼,如:

#include <stdlib.h> 
#include <stdio.h> 

#include "zlib.h" 

int main(int argc, char *argv[]) 
{ 
    long a; 
    char buffer[1024]; 
    a = 1024; 
    compress(buffer,&a,"testing",7); 
    return 0; 
} 

編譯:

gcc test.c -lzlib -Wall -o test.exe 

編譯罰款。 但是,exe壓縮函數崩潰。 有什麼建議嗎?

回答

0

望着zlib的手冊,它說:

ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, 
          const Bytef *source, uLong sourceLen)); 

壓縮源緩衝區中的 目標緩衝區。 sourceLen是源緩衝區的字節長度 。在 條目中,destLen是目標緩衝區的總大小 ,它必須是 至少由 compressBound(sourceLen)返回的值。退出時, destLen是 壓縮緩衝區的實際大小。

也許a=1024是不是夠大?我想你需要撥打compressBound以獲得合適的價值。

+0

出於某種原因,我發現mingw有一個zlib庫和libz庫。當我使用libz時,一切正常。我真的不知道有什麼區別,或者爲什麼這個名字倒退,哦,井。該手冊說輸出緩衝區只需比輸入多12個字節,因爲這是最壞情況下的壓縮(10個字節的標題和2個字節說沒有壓縮?)。它現在適用於libz而不是zlib。事實上,我認爲zlib庫文件是一些文件,這些文件在一段時間之前由於配置錯誤而意外安裝。 (p。要MODS:答案你自己的問題按鈕不適合我?!) – myforwik 2010-11-12 09:41:36

+0

@myforwik:libz是zlib。 – 2010-11-12 09:59:54

0

我試圖使用MSYS中的zlib(可通過mingw-get訪問),並得到了如下所述的相同問題。

解決方案是做一個靜態鏈接,而不是使用共享庫。 只需刪除或重命名導入庫libz.dll.a以避免鏈接程序與msys-z.dll進行鏈接。

重新編譯,它會工作。

另一種方法是自己從zlib.net網站安裝zlib。 從mingw-get中刪除一個。

0

在您的代碼中使用zlib非常簡單,文檔(或我發現的stackoverflow上的各種答案)並不明顯。

以下技術適用於任何編譯器和IDE。我使用代碼:blocks在windows mingw中測試它,這就是爲什麼我將它作爲這個問題的答案發布的原因。

  1. http://www.zlib.net/

  2. 下載zlib的源代碼複製所有的.c和.h文件從zlib源代碼的根文件夾中的文件夾中的編譯器搜索路徑。

  3. 將zlib源文件添加到IDE項目中。

  4. 添加#include「zlib。H」到你的源代碼

  5. 呼叫壓縮或解壓縮

就是這樣。這簡直是簡單的。

所有你必須要小心的是內存管理,因爲這爲c 。代碼

爲了讓事情我自己簡單的,我已經把一個C++封裝程序,歡迎您的使用,像這樣:

/** ZLIB C++ wrapper 

Usage: 

<pre> 

    #include "cZLIB.h" 

    { 
    // compress data in bigbuffer 
    raven::set::cZLIB ZLIB; 
    ZLIB.Compress(bigbuffer, sizebigbuffer); 

    // use compressed buffer, before ZLIB goes out of scope 
    use(ZLIB.Buffer(), ZLIB.Length()); 

    } 

    ... 

    { 

    // decompress data in smallbuffer 
    raven::set::cZLIB ZLIB; 
    ZLIB.Inflate(smallbuffer, sizesmallbuffer) 

    // use decompressed data, before ZLIB goes out of scope 
    use(ZLIB.Buffer(), ZLIB.Length()); 

    } 

</pre> 

Build: 

Download this code (cZLIB.h and cZLIB.cpp) from 

https://github.com/JamesBremner/raven-set 

and install somewhere in your compiler search path. 
Let's assume you install it in folder .../src. 

Download the zlib source code from http://www.zlib.net/ 
Copy all the .c and .h files from the root folder of the zlib source 
to a new folder .../src/zlib 

Add the files cZLIB.h, cZLIB.cpp and all the files in .../src/zlib 
to the IDE project. 

Build. 

*/ 
class cZLIB 
... 
1

我推薦使用MSYS2這種東西。這些說明假定您想要編譯一個64位程序,但是它們可以很容易地修改爲32位。

安裝MSYS2後,在開始菜單中運行「MinGW-w64 Win64 Shell」快捷方式。通過運行安裝64位的工具鏈:

pacman -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-zlib 

然後通過運行這樣的編譯代碼:

gcc test.c -lz -o test 

我沒有仔細檢查你的代碼,但我能夠在不運行代碼任何崩潰,所以你的代碼可能會好。你的代碼也沒有輸出,所以很難判斷它是否真的有效。