2010-11-12 4 views
7

Я не могу заставить zlib делать что-либо на mingw под окнами.Использование 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 падает с функцией сжатия. Любые идеи?

ответ

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. Infact Я думаю, что файлы библиотеки zlib - это файлы, некоторые из которых случайно были установлены еще с момента создания монетизации. (p.s. Моды: ответ на вашу собственную кнопку вопроса не работает для меня ?!) – myforwik

+0

@myforwik: libz is zlib. – 2010-11-12 09:59:54

0

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

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

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

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

0

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

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

  1. Скачать исходный код Zlib из http://www.zlib.net/

  2. Скопируйте все .c и .h файлы из корневой папки источника ZLIB к папке в поисковой составитель пути.

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

  4. Добавить #include "zlib.ч»к исходному коду

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

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

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

чтобы сделать еще проще для себя, я соединил обертку 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 

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

Смежные вопросы