zLib einbinden



  • Hi!

    Hat jemand schon mal die zLib eingebunden und könnte mir einen Beispielcode schicken?

    Ich bekomme Linkerfehler:

    unresolved external symbol _deflate@8
    unresolved external symbol _deflateEnd@4
    unresolved external symbol _deflateInit_@16

    obwohl ich einiges eingebunden habe, unter anderem:

    #include "zlib.h"
    #include "zip.h"

    Was könnte ich da tun?

    MfG

    Matg40



  • Die Headerdateien allein bringen dir nichts. Du musst schon die Quellcodedateien der zlib dazu kompilieren, oder aus diesen Dateien eine lib bauen und diese linken.



  • Hi!

    Ich hab jetzt nochmal alles mögliche versucht (inklusive Beispieldateien der zLib-Homepage), aber es ging nicht....

    Hat nicht zufällig jemand ein Projekt in dem die zLib eingebunden ist (z.B. das Homepage-Beispiel) ?

    MfG

    Matg40



  • Übergib dem Compiler den Link-flag "-lz". Dann gehts.

    Tntnet



  • Hi!

    Ich verwende Visual Studio 6.0, wo müsste ich da die Option eintragen?

    (Sorry, habe hierbei nicht allzuviel Erfahrung... 😞 )

    Ich habs an mehreren Stellen versucht, aber die "unbekannte Option lz wird ignoriert".

    MfG

    Matg40



  • Hi!

    Ich habe jetzt ein zweites Projekt in den Workspace hinzugefügt (Win32 Static Library), in dem ich die zLib selber bauen will (bisher hatte ich u.a. versucht, die fertige zliblib.lib einzubinden).

    Jetzt gibts aber endlos Fehler bei der ioapi.h ...

    Ich habe alle .c-Files als Sourcen und alle .h-Files als Header eingebunden.

    Was könnte jetzt noch falsch sein?

    MfG

    Matg40



  • Hi!

    Fortschritte !!!

    Ich habe jetzt laut unterschiedlichen Beispielen

    WIN32,_MBCS,_LIB,_WINDOWS,__NT__,_WINSTATIC,__WIN32__,_UNICODE,UNICODE,ZLIB_WINAPI,NOCRYPT,NOUNCRYPT

    angegeben, wobei ZLIB_WINAPI wohl das Wichtigste ist...

    => es hat sich fehlerfrei übersetzen und starten lassen (wenn es auch noch nicht so funktioniert, wie ich es gerne hätte, aber es wird)!

    MfG

    Matg40



  • Matg40 schrieb:

    Hi!

    Ich verwende Visual Studio 6.0, wo müsste ich da die Option eintragen?

    (Sorry, habe hierbei nicht allzuviel Erfahrung... 😞 )

    Ich habs an mehreren Stellen versucht, aber die "unbekannte Option lz wird ignoriert".

    MfG

    Matg40

    Hi,

    sinnvoller, als die zlib selbst zu bauen wäre, die Bibliothek zu linken. Dafür dient -lz (zumindest bei den meisten Compilern). Aus Visual Studio schliesse ich, daß Du Windows hast. Da heißt es irgendwie anders als üblich. Irgendwie in einem Dialog kannst Du sicher angeben, welche Bibliotheken dazu gelinkt werden sollen. Da gibst Du die zlib an. Ich weiß allerdings nicht, wie die zlib-Biblothek unter Windows heißt. Unter Unix/Linux heißt sie meistens libz.so oder libz.a.

    Tntnet



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi!

    Nachdem ich es jetzt endlich hinbekommen habe, dass das zLib-Beispiel übersetzt wird, erzeugt es nun fehlerhafte zip-Dateien.

    Als Eingabe habe ich eine Textdatei verwendet, die einfach in eine Zip-Datei gepackt werden soll.

    Es kommt dann eine zip-Datei heraus, die z.B. von WinRAR als fehlerhaft angezeigt wird.

    Hier der angepasste Beispiel-Code:

    /* zpipe.c: example of proper use of zlib's inflate() and deflate()
    Not copyrighted -- provided to the public domain
    Version 1.4 11 December 2005 Mark Adler */

    /* Version history:
    1.0 30 Oct 2004 First version
    1.1 8 Nov 2004 Add void casting for unused return values
    Use switch statement for inflate() return values
    1.2 9 Nov 2004 Add assertions to document zlib guarantees
    1.3 6 Apr 2005 Remove incorrect assertion in inf()
    1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions
    Avoid some compiler warnings for input and output buffers
    */

    //#include "stdafx.h"

    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    #include "zlib.h"

    #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
    # include <fcntl.h>
    # include <io.h>
    # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
    #else
    # define SET_BINARY_MODE(file)
    #endif

    #define CHUNK 16384

    /* Compress from file source to file dest until EOF on source.
    def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
    allocated for processing, Z_STREAM_ERROR if an invalid compression
    level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
    version of the library linked do not match, or Z_ERRNO if there is
    an error reading or writing the files. */
    int def(FILE *source, FILE *dest, int level)
    {
    int ret, flush;
    unsigned have;
    z_stream strm;
    unsigned char in[CHUNK];
    unsigned char out[CHUNK];

    /* allocate deflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    ret = deflateInit(&strm, level);
    if (ret != Z_OK)
    return ret;

    /* compress until end of file */
    do {
    strm.avail_in = fread(in, 1, CHUNK, source);
    if (ferror(source)) {
    (void)deflateEnd(&strm);
    return Z_ERRNO;
    }
    flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
    strm.next_in = in;

    /* run deflate() on input until output buffer not full, finish
    compression if all of source has been read in /
    do {
    strm.avail_out = CHUNK;
    strm.next_out = out;
    ret = deflate(&strm, flush); /
    no bad return value /
    assert(ret != Z_STREAM_ERROR); /
    state not clobbered /
    have = CHUNK - strm.avail_out;
    if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
    (void)deflateEnd(&strm);
    return Z_ERRNO;
    }
    } while (strm.avail_out == 0);
    assert(strm.avail_in == 0); /
    all input will be used */

    /* done when last data in file processed /
    } while (flush != Z_FINISH);
    assert(ret == Z_STREAM_END); /
    stream will be complete */

    /* clean up and return */
    (void)deflateEnd(&strm);
    return Z_OK;
    }

    /* Decompress from file source to file dest until stream ends or EOF.
    inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
    allocated for processing, Z_DATA_ERROR if the deflate data is
    invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
    the version of the library linked do not match, or Z_ERRNO if there
    is an error reading or writing the files. */
    int inf(FILE *source, FILE *dest)
    {
    int ret;
    unsigned have;
    z_stream strm;
    unsigned char in[CHUNK];
    unsigned char out[CHUNK];

    /* allocate inflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = 0;
    strm.next_in = Z_NULL;
    ret = inflateInit(&strm);
    if (ret != Z_OK)
    return ret;

    /* decompress until deflate stream ends or end of file */
    do {
    strm.avail_in = fread(in, 1, CHUNK, source);
    if (ferror(source)) {
    (void)inflateEnd(&strm);
    return Z_ERRNO;
    }
    if (strm.avail_in == 0)
    break;
    strm.next_in = in;

    /* run inflate() on input until output buffer not full /
    do {
    strm.avail_out = CHUNK;
    strm.next_out = out;
    ret = inflate(&strm, Z_NO_FLUSH);
    assert(ret != Z_STREAM_ERROR); /
    state not clobbered /
    switch (ret) {
    case Z_NEED_DICT:
    ret = Z_DATA_ERROR; /
    and fall through */
    case Z_DATA_ERROR:
    case Z_MEM_ERROR:
    (void)inflateEnd(&strm);
    return ret;
    }
    have = CHUNK - strm.avail_out;
    if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
    (void)inflateEnd(&strm);
    return Z_ERRNO;
    }
    } while (strm.avail_out == 0);

    /* done when inflate() says it's done */
    } while (ret != Z_STREAM_END);

    /* clean up and return */
    (void)inflateEnd(&strm);
    return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
    }

    /* report a zlib or i/o error */
    void zerr(int ret)
    {
    fputs("zpipe: ", stderr);
    switch (ret) {
    case Z_ERRNO:
    if (ferror(stdin))
    fputs("error reading stdin\n", stderr);
    if (ferror(stdout))
    fputs("error writing stdout\n", stderr);
    break;
    case Z_STREAM_ERROR:
    fputs("invalid compression level\n", stderr);
    break;
    case Z_DATA_ERROR:
    fputs("invalid or incomplete deflate data\n", stderr);
    break;
    case Z_MEM_ERROR:
    fputs("out of memory\n", stderr);
    break;
    case Z_VERSION_ERROR:
    fputs("zlib version mismatch!\n", stderr);
    }
    }

    /* compress or decompress from stdin to stdout */
    int main(int argc, char **argv)
    {
    int ret;

    /* avoid end-of-line conversions */
    //SET_BINARY_MODE(stdin);
    //SET_BINARY_MODE(stdout);

    /* do compression if no arguments
    if (argc == 1) {
    ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
    if (ret != Z_OK)
    zerr(ret);
    return ret;
    }

    // do decompression if -d specified
    else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
    ret = inf(stdin, stdout);
    if (ret != Z_OK)
    zerr(ret);
    return ret;
    }

    // otherwise, report usage
    else {
    fputs("Fehlerhafte Angaben: usage: zpipe [-d] < source > dest\n", stderr);
    return 1;
    }

    */

    FILE* source=fopen("C:\\temp\\test.txt","r");

    FILE* dest=fopen("C:\\temp\\test.zip","w");

    ret = def(source, dest, Z_DEFAULT_COMPRESSION);

    if (ret != Z_OK)
    zerr(ret);

    fclose(source);

    fflush(dest);
    fclose(dest);

    return ret;

    }

    Kann mir da jemand weiterhelfen?

    MfG

    Matg40


Log in to reply