Frage zum zlib.h benzutzen bzgl. gzip
-
Hallo
Ich möchte gern einige Funktionen von zlib.h benutzen. Zum Beispiel gzread() zum blockweisen Einlesen von Daten aus einer .gz-Datei.
Ich arbeite hier an einem Linux-Rechner, auf dem sich unter /usr/lib auch eine zlib.so befindet. /usr/lib wird auch als Pfad ausgegeben von "g++ -print-search-strings". root-Rechte habe ich nicht.
Wenn ich in meinem Programm nun folgendes schreibe:
#include "zlib.h" int main(int argc, char* argv[]) { unsigned int len = 256; unsigned char buf[256]; unsigned char file[] = "~/testARM/neu/trace.gz"; int retVal = gzread(file, buf, len); for (unsigned int i = 0; i < len; i++) { cout << buf[i]; } cout << endl; return 0;
dann wird das compiliert, aber das Linken scheitert:
In function `main': /usr/include/g++/bits/vector.tcc:235: undefined reference to `gzread' collect2: ld returned 1 exit status
1. Es scheint ja irgendwas (vermutliches einfaches ?) zu fehlen. Jemand eine Idee ?
2. Falls die Benutzung von gzread oben falsch sein sollte - durchaus möglich. Ich habe (noch) keinen Schimmer, wie das gehen soll. Um das zu testen müsste ich ja aber ein ausführbares Programm haben
Vielen Dank für Hinweise !
Benjamin
-
Benja_m schrieb:
1. Es scheint ja irgendwas (vermutliches einfaches ?) zu fehlen. Jemand eine Idee ?
Ja, die lib (bzw. in der lib der Eintrag für gzread). Es könnte auch sein, daß der Compiler Probleme mit dem name mangling hat.
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
-
benjamin@tom:/usr/lib> gcc -lz /usr/lib/gcc-lib/i586-suse-linux/3.3.3/../../../../i586-suse-linux/bin/ld: cannot open output file a.out: Keine Berechtigung collect2: ld returned 1 exit status
-
ayayay
warum versuchst du auch in einem Ordner zu kompilieren in dem du keine Schreibrechte hast. Bitte Kopf einschalten
> cd > gcc foo.c -lz
Weitere Infos zum linken findest du übrigens im GCC Handbuch
-
ja, war mir aufgefallen. selber aufruf in ~ - selbes ergebnis. wollte das auch eigentlich hier posten. hab wohl im falschen xterm markiert gehabt
im übrigen habe ich etwas länger gebraucht zu begreifen, dass "-lz" bedeutet, dass er in der lib "zlib" oder "libz" zu suchen hat. auch ein "man gcc" war da nicht soo hilfreich (weil zu umfangreich vermutlich).
ich dachte zuerst, das wäre eine option und kein parameter.muss dazusagen, dass ich eigentlich auch in eclipse mit cdt arbeite und dort wird gcc ja automatisch "bedient".
trotzdem schonmal danke für die hinweise. ich schau gerade, ob ich das hinbekomme.
-
okay, jetzt hast du mich völlig verwirrt
#include <iostream> #include "zlib.h" int main(int argc, char* argv[]) { unsigned int len = 256; unsigned char buf[256]; unsigned char file[] = "~/testARM/neu/trace.gz"; int retVal = gzread(file, buf, len); for (unsigned int i = 0; i < len; i++) { std::cout << buf[i]; } std::cout << std::endl; return 0; }
benjamin@tom:~> gcc test.cpp /tmp/ccp9Cyfd.o(.text+0x7e): In function `main': : undefined reference to `gzread' /tmp/ccp9Cyfd.o(.text+0xba): In function `main': : undefined reference to `std::cout' /tmp/ccp9Cyfd.o(.text+0xbf): In function `main': : undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, unsigned char)' /tmp/ccp9Cyfd.o(.text+0xd4): In function `main': : undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' /tmp/ccp9Cyfd.o(.text+0xd9): In function `main': : undefined reference to `std::cout' /tmp/ccp9Cyfd.o(.text+0xde): In function `main': : undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))' /tmp/ccp9Cyfd.o(.text+0x10a): In function `__static_initialization_and_destruction_0(int, int)': : undefined reference to `std::ios_base::Init::Init[in-charge]()' /tmp/ccp9Cyfd.o(.text+0x139): In function `__tcf_0': : undefined reference to `std::ios_base::Init::~Init [in-charge]()' /tmp/ccp9Cyfd.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status
Das ist dann schon komisch irgendwie.
ob ich "lz" als parameter an den gcc übergebe spielt keine rolle, ergebnis bleibt gleich.
-
Warum kompilierst Du C++ Code mit dem gcc? Dafür nimmt man den g++
-
manche dinge sind *zu* einfach *kopfschüttel*
danke.
das mit parameter "lz" klappt jetzt auch.
nun muss ich die funktionalität in den griff kriegen. kann dann ja auch nicht weiter schwer sein