2010-11-12 40 views
7

Parece que no puedo hacer que zlib haga nada en mingw bajo Windows.Uso de zlib en Windows mingw

He descargado zlib @http://sourceforge.net/projects/mingw/files_beta/MinGW/zlib/zlib-1.2.3-1-mingw32/ y puse los archivos de encabezado y lib en el lugar correcto.

código simple como:

#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; 
} 

compilado:

gcc test.c -lzlib -Wall -o test.exe 

compila bien. Sin embargo, el exe se bloquea en la función de compresión. Alguna idea?

Respuesta

0

Mirando el manual de zlib que dice:

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

comprime el búfer de origen en el búfer destino. sourceLen es el byte de longitud del buffer fuente. Tras la entrada , destLen es el tamaño total de el búfer de destino, que debe ser al menos el valor devuelto por compressBound (sourceLen). Al salir, destLen es el tamaño real del buffer comprimido .

¿Tal vez a=1024 no es lo suficientemente grande? Creo que debe llamar al compressBound para obtener un valor adecuado.

+0

Por alguna razón, me encontré con que MinGW tiene una biblioteca zlib y la biblioteca libz. Cuando uso libz, todo funciona. Realmente no sé cuáles son las diferencias o por qué el nombre está al revés, oh pozos. El manual dice que el buffer de salida solo tiene que ser 12 bytes más que la entrada, ya que es la peor de las mayúsculas y minúsculas (encabezado de 10 bytes y 2 bytes para decir que no hay compresión?). Funciona ahora con libz en lugar de zlib. De hecho, creo que los archivos de la biblioteca zlib son archivos que de alguna manera se instalaron accidentalmente hace tiempo a partir de una configuración errónea. (p.s.a mods: la respuesta a su propio botón de pregunta no funciona para mí ?!) – myforwik

+0

@myforwik: libz es zlib. –

0

Intenté usar el zlib de MSYS (accesible con mingw-get) y tuve el mismo problema que el descrito a continuación.

La solución es hacer un enlace estático en lugar de utilizar la biblioteca compartida. Simplemente elimine o cambie el nombre de la biblioteca de importación libz.dll.a para evitar que el enlazador haga un enlace con msys-z.dll.

Vuelva a compilar y estará funcionando.

Otra forma es instalar zlib usted mismo desde el sitio web zlib.net. Elimina el de mingw-get.

0

El uso de zlib en su código es extremadamente simple, algo que la documentación (o las diversas respuestas en stackoverflow que encontré) no lo hacen obvio.

La siguiente técnica funciona para cualquier compilador e IDE. Lo probé en windows mingw usando code: blocks, por lo que lo publico como respuesta a esta pregunta.

  1. descargar el código fuente de zlib http://www.zlib.net/

  2. copiar todos los archivos .c y .h desde la carpeta raíz de la fuente de zlib a una carpeta en la ruta de búsqueda del compilador.

  3. Agregue los archivos fuente zlib al proyecto IDE.

  4. Agregar #include "zlib.h" a su código fuente

  5. compresa de llamadas o descomprimir

Eso es todo. No podría ser más simple.

único que hay que tener cuidado es la gestión de memoria, ya que esta es c . código

para hacer las cosas aún más simple para mí, he elaborado un envoltorio de C++ que pueden hacer uso, de esta manera:

/** 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

recomiendo el uso de MSYS2 para este tipo de cosas. Estas instrucciones suponen que desea compilar un programa de 64 bits, pero pueden modificarse fácilmente para 32 bits.

Después de instalar MSYS2, ejecutar el acceso directo "MinGW-W64 Win64 Shell" en el menú Inicio. Instalar el conjunto de herramientas de 64 bits ejecutando:

pacman -S mingw-w64-x86_64-toolchain mingw-w64-x86_64-zlib 

A continuación, compilar el código ejecutando algo como esto:

gcc test.c -lz -o test 

no el registro de su código cuidadosamente, pero yo era capaz de ejecutar su código sin cualquier bloqueo, por lo que su código podría estar bien. Tu código tampoco da salida, por lo que es difícil saber si realmente funcionó.