Использование zlib под windows mingw - PullRequest
10 голосов
/ 12 ноября 2010

Я не могу заставить zlib что-либо делать с mingw под windows.

Я скачал 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 падает на функцию сжатия.Есть идеи?

Ответы [ 4 ]

6 голосов
/ 27 марта 2017

Я рекомендую использовать 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

Я не проверял ваш код тщательно, но смогзапустить ваш код без сбоев, так что ваш код может быть в порядке.Ваш код также не выдает выходных данных, поэтому трудно сказать, действительно ли он работал.

0 голосов
/ 10 марта 2014

Я попытался использовать zlib из MSYS (доступный через mingw-get) и получил ту же проблему, как описано ниже.

Решение состоит в том, чтобы создать статическую ссылку вместо использования общей библиотеки.Просто удалите или переименуйте библиотеку импорта libz.dll.a, чтобы компоновщик не связался с msys-z.dll.

Перекомпилируйте, и он будет работать.

Другой способустановить zlib самостоятельно с сайта zlib.net.Удалить один из Mingw-Get.

0 голосов
/ 24 февраля 2017

Использование zlib в вашем коде чрезвычайно просто, что документация (или различные ответы о stackoverflow, которые я нашел) не делает очевидными.

Следующая методика работает для любого компилятора и IDE.Я протестировал его в Windows MINGW, используя код: блоки, поэтому я публикую его в качестве ответа на этот вопрос.

  1. Загрузите исходный код zlib с http://www.zlib.net/

  2. Скопируйте все файлы .c и .h из корневой папки исходного кода zlib в папку в пути поиска компилятора.

  3. Добавьте исходные файлы zlib вПроект IDE.

  4. Добавьте #include "zlib.h" в свой исходный код

  5. Вызовите сжатие или распаковку

Вот и все.Это вряд ли может быть проще.

Все, что вы должны быть осторожны, это управление памятью, так как это код c.

Чтобы упростить для себя вещи, я собрал оболочку c ++, которую вы можете использовать, например:

<code>/** 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() );

    }

Сборка: загрузите этот код (cZLIB.h и cZLIB.cpp).) из https://github.com/JamesBremner/raven-set и установите где-нибудь в пути поиска компилятора.Предположим, вы установили его в папку ... / src.Загрузите исходный код zlib из http://www.zlib.net/ Скопируйте все файлы .c и .h из корневой папки исходного кода zlib в новую папку ... / src / zlib Добавьте файлы cZLIB.h, cZLIB.cpp и всефайлы в ... / src / zlib для проекта IDE.Построить.* / класс cZLIB ...
0 голосов
/ 12 ноября 2010

Глядя на руководство по zlib, оно говорит:

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

Сжатие исходного буфера в целевой буфер. sourceLen является длина байта исходного буфера. на entry, destLen - это общий размер целевой буфер, который должен быть по крайней мере, значение, возвращаемое compressBound (sourceLen). При выходе, destLen - это фактический размер сжатый буфер.

Может быть, a=1024 не достаточно большой? Я думаю, вам нужно позвонить compressBound, чтобы получить подходящее значение.

...