【问题标题】:Using zlib under windows mingwwindows mingw下使用zlib
【发布时间】:2010-11-12 09:27:24
【问题描述】:

我似乎无法让 zlib 在 windows 下的 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 在压缩功能处崩溃。 有什么想法吗?

【问题讨论】:

    标签: c windows mingw zlib


    【解决方案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
    

    我没有仔细检查您的代码,但我能够运行您的代码而不会崩溃,因此您的代码可能没问题。你的代码也没有输出,所以很难判断它是否真的有效。

    【讨论】:

    • 你明白为什么你应该-lz而不是-lzlib吗?我已经看到 zlib 包安装了一个 libz.a 文件(和一个 libz.dl.al),但我还没有弄清楚为什么它在这个系统上有所不同。对我来说,这很重要,因为我正在安装一个我无法修改的 python 包 lxml。
    • 好吧,链接器会自动将lib 添加到库名称之前,因此如果您想链接到libz.a-lz 是正确的选项。如果其他一些软件正在尝试使用-lzlib(而不是做正确的事情并运行pkg-config zlib --libs来找出参数),并且您无法配置该软件以使用正确的参数,那么我想您可以复制libz.alibzlib.a 作为一种变通的解决方法。
    • 谢天谢地,将文件复制到新名称导致编译成功。我仍然不相信它应该是同一个文件,但我很快就会发现。
    【解决方案2】:

    查看 zlib 手册,它说:

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

    将源缓冲区压缩到 目标缓冲区。 sourceLen 是 源缓冲区的字节长度。之上 条目,destLen 是总大小 目标缓冲区,必须是 至少返回的值 compressBound(sourceLen)。出境时, destLen 是实际大小 压缩缓冲区。

    也许a=1024 还不够大?我认为您需要致电compressBound 以获得合适的值。

    【讨论】:

    • 由于某种原因我发现mingw有一个zlib库和libz库。当我使用 libz 时,一切正常。我真的不知道有什么区别,也不知道为什么名字倒了,哦,好吧。手册说输出缓冲区只需比输入多 12 个字节,因为这是最坏情况下的压缩(10 字节标题和 2 字节表示不压缩?)。它现在适用于 libz 而不是 zlib。事实上,我认为 zlib 库文件是一些在很久以前从错误配置中意外安装的文件。 (附:对模组:回答你自己的问题按钮对我不起作用?!)
    【解决方案3】:

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

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

    重新编译就可以了。

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

    【讨论】:

      【解决方案4】:

      在您的代码中使用 zlib 非常简单,文档(或我在 stackoverflow 上找到的各种答案)并不明显。

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

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

      2. 将所有 .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
      ...
      

      【讨论】:

      • 这是对如何vendorize zlib 的描述。他们想使用系统的 zlib,而不是他们自己私下跟踪和更新的版本。
      猜你喜欢
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      相关资源
      最近更新 更多