在Windows下使用mingw编译器使用zlib

12

我在windows下的mingw中使用zlib似乎无法实现任何功能。

我从http://sourceforge.net/projects/mingw/files_beta/MinGW/zlib/zlib-1.2.3-1-mingw32/下载了zlib,并将头文件和库文件放在了正确的位置。

像这样简单的代码:

#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

编译没有问题。 但是可执行文件在压缩函数处崩溃。 有什么想法吗?

4个回答

7

我建议使用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

我没有仔细检查你的代码,但是我能够运行你的代码而没有任何崩溃,所以你的代码可能没问题。你的代码也没有输出,所以很难判断它是否真正起作用。


你明白为什么应该使用-lz而不是-lzlib吗?我发现zlib软件包安装了一个libz.a文件(和一个libz.dl.al),但我还没有弄清楚为什么在这个系统上它不同。对我来说很重要,因为我正在安装一个Python包lxml,我无法修改它。 - jpaugh
1
好的,链接器会自动在库名前面添加 lib,因此如果您想链接到 libz.a,则 -lz 是正确的选项。如果其他软件尝试使用 -lzlib(而不是运行 pkg-config zlib --libs 来确定参数),并且您无法配置该软件以使用正确的参数,则我想您可以将 libz.a 复制到 libzlib.a 中作为一个 hacky 解决方案。 - David Grayson
谢天谢地,将文件复制到新名称后,编译成功了。我仍然不确定它是否应该是相同的文件,但我很快就会找出来。 - jpaugh

0

查看zlib手册,它说:

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

Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer.

也许 a=1024 不够大?我认为你需要调用 compressBound 来获取一个合适的值。

由于某些原因,我发现mingw有一个zlib库和一个libz库。当我使用libz时,一切正常。我不知道它们的区别或为什么名称是反向的,哦好吧。手册说输出缓冲区只需要比输入多12个字节,因为这是最坏情况下的压缩(10字节头和2字节表示无压缩?)。现在使用libz而不是zlib可以正常工作。实际上,我认为zlib库文件是一些错误配置很久以前意外安装的文件。(附言:对于管理员:自己回答问题按钮对我不起作用?!) - myforwik

0

我尝试使用MSYS中的zlib(可通过mingw-get访问),并遇到了如下所述的相同问题。

解决方案是进行静态链接,而不是使用共享库。 只需删除或重命名导入库libz.dll.a,以避免链接器与msys-z.dll进行链接。

重新编译即可正常工作。

另一种方法是从zlib.net网站自己安装zlib。 删除mingw-get中的zlib。


0

在您的代码中使用zlib非常简单,这是文档(或我找到的各种stackoverflow答案)没有明显提到的。

以下技术适用于任何编译器和IDE。我在Windows mingw中使用code:blocks进行了测试,这就是为什么我将其发布为此问题的答案。

  1. http://www.zlib.net/下载zlib源代码

  2. 将zlib源根文件夹中的所有.c和.h文件复制到编译器搜索路径中的文件夹中。

  3. 将zlib源文件添加到IDE项目中。

  4. 在您的源代码中添加#include "zlib.h"

  5. 调用compress或uncompress

就是这样。它几乎不能更简单了。

您唯一需要注意的是内存管理,因为这是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
...

这是如何将 zlib 进行 供应商化 的描述。他们想使用系统自带的 zlib,而不是他们自己跟踪和更新的版本。 - Fredrick Brennan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接