2010-11-12 138 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 

我没有仔细检查你的代码,但我能够在不运行代码任何崩溃,所以你的代码可能会好。你的代码也没有输出,所以很难判断它是否真的有效。