.zip entpacken
-
ok,
libz.a is ne library, die in /usr/include liegt
was ist der unterschied zwischen libXYZ.so und libXYZ.a
in meinem eclipse mit CDT plugin kann ich anscheinend mit der -l option eine z-lib integrieren, allerdings werden noch immer funktionen nicht gefunden
na ma guggen
gruß davey
-
zlib ist schon die richtige Antwort. Schau einfach in den Source von minizip. Da hast Du ein Beispiel.
Ich habe für meinen Tntnet (www.tntnet.org) einen C++-Wrapper geschrieben. Wenn Du Tntnet installierst, findest Du in der libtntnet eine Klasse tnt::unzipFile. Am einfachsten ist die Verwendung von tnt::unzipFileStream. Schau einfach in den Header tnt/unzipfile.h. Hier ein kleines Beispiel:
#include <tnt/unzipfile.h> #include <iostream> int main() { try { tnt::unzipFile f("datei.zip"); // öffne ZIP-Datei tnt::unzipFileStream d(f, "datei.txt"); // öffne Datei innerhalb der ZIP-Datei std::cout << d.rdbuf() << std::endl; // gebe Datei auf std::cout aus return 0; } catch (const std::exception& e) { // bei Fehlern wird eine Exception ausgelöst std::cerr << e.what() << std::endl; return -1; } }
-
davey schrieb:
ok,
libz.a is ne library, die in /usr/include liegt
was ist der unterschied zwischen libXYZ.so und libXYZ.a
in meinem eclipse mit CDT plugin kann ich anscheinend mit der -l option eine z-lib integrieren, allerdings werden noch immer funktionen nicht gefunden
na ma guggen
gruß davey
Deine libz.a liegt bestimmt nicht unter /usr/include (oder Du hast ein ziemlich verhunztes System). Unter /usr/include liegen die Header-Dateien, welche die Schnittstelle zur Library beschreiben. Die libz.a liegt unter /usr/lib.
Die libz.a ist eine statische Bibliothek. Die libz.so die dynamische. Linke ich ein statisches Programm, werden alle Funktionen in mein Programm kopiert. Das ergibt ziemlich grosse Binaries. Dafür wird die libz.a benötigt. Normalerweise linke ich dynamisch. Dann wird nur ein Verweis auf die Funktionen in libz.so eingebaut. Die Binaries werden weitaus kleiner, benötigen aber zur Laufzeit die libz.so.
Tommi
-
danke für den tip, ich werds mir ma anschauen!
allerdings denke ich, dass es momentan nur am linken liegt, denn in /usr/include/ liegt einerseits eine libz.so und eine libz.a
wenn ich nun in meinem eclipse bei der -l option des linkers "z" mitgebe, dann wird wohl die libz.so statt der libz.a integriert
also muss ich nur noch wissen, wie man ne .a datei verlinkt...
gruß davey
-
hey Tommi,
da warste schneller, vielen dank für diese ausführliche erklärung, da gehen einem lichter auf...
(natürlich meinte ich /usr/lib/ hab ich ja vor n paar tagen hier gelernt
nur weiß ich noch immer nich wie ich das in meinem eclipse hinbekomme, im minizipprojekt hab ich im makefile auf meine /usr/lib/libz.a verwiesen und es ging,.
kann ja net so schwer sein das im eclipse hinzubekommen, allerdings werden dort die makefiles automatisch erzeugt, sodass man da leider nich einfach was reinschreiben kann
mfg davey
-
davey schrieb:
wenn ich nun in meinem eclipse bei der -l option des linkers "z" mitgebe, dann wird wohl die libz.so statt der libz.a integriert
Warum willst Du denn die statische Version verwenden? Nimm die dynamische.
also muss ich nur noch wissen, wie man ne .a datei verlinkt...
Kommt auf Deinen Linker an, beim ld zB mit der Option -static.
-
hi,
also um es präzise zu formulieren möchte ich den code von miniunzip (später mal bis aufs nötigste abgespeckt) in mein c++projekt einbinden.
im makefile von miniunzip wird die statische zlib.a beim kompilieren respektive linken(?) hinzugefügt, (deshalb wollt ich die statische)
nun gut das konnte ich bei den kompileroptionen mit angeben, allerdings bin ich nicht befähigt die "main" umzuschreiben und so in mein projekt einzubinden, dass alle referenzen stimmenals workaround rufe ich nun doch das programm mit "system("./miniunzip XYZ.zip")" auf, was ich ja eigentlich nicht wollte
gruß davey
-
Du musst doch nur die Funktionen aus dem Header verwenden und zur libz.so linken, was davon schaffst Du nicht?
-
hi nman,
das miniunzip ist ein eigenständiges c-programm, im make file steht folgendes:
UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a .c.o: $(CC) -c $(CFLAGS) $*.c all: miniunz miniunz: $(UNZ_OBJS) $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
die haben da noch ne eigene libz.a, daher wollte ich krampfhaft die statische lib haben...
ich wollte nun lediglich die main umbenennen, um sie aus meinem c++programm aufrufen zu können und das bekomme ich einfach nicht hin,
in "miniunz.c" ist die main, die hab ich ma zipnow() genannt, weiterhin hab ich die files ioapi.c/.h und die unzip.c/.h in meinem projekt... die miniunz.c includiere ich in meiner main (ob das funzt...?), nun wird zwar die funktion zipnow() ohne probleme gefunden, jedoch ruft diese funktion zb die funktion "unzOpen(zipfilename)" aus unzip.c/.h aufgerufen, und da zieh ich beim linken immer folgende error meldung:./main.o: In function `zipnow(int, char*)':../miniunz.c:543: undefined reference to `unzOpen' :../miniunz.c:551: undefined reference to `unzOpen'
eigentlich wollte ich ja sowas in der art machen, was tntnet-tommi vorgeschlagen hat, aber durch seinen code steig ich erstma so gar nicht durch, mit den tnt-namespaces... da hab ich hart keinen plan, habs zwar ma kurzzeitig versucht, wollte aber dann doch lieber den anderen weg verfolgen
gruß davey
-
Hi,
wenn Dir das ohne Namespaces lieber ist und die Fehlerbehandlung habe ich auch weg gelassen. Einfacher geht es dann nicht mehr:
#include <tnt/unzipfile.h> #include <iostream> using namespace std; using namespace tnt; int main() { unzipFile f("datei.zip"); // öffne ZIP-Datei unzipFileStream d(f, "datei.txt"); // öffne Datei innerhalb der ZIP-Datei cout << d.rdbuf() << endl; // gebe Datei auf cout aus }
Tommi
-
davey schrieb:
das miniunzip ist ein eigenständiges c-programm, im make file steht folgendes
Und es gibt eine zip.h bzw. unzip.h, die verwendest Du.
-
hi,
@nman
ja, das is ja das komische, die unzip.h wird in der miniunzip.c includiert, wodurch ja die funktionen nach meinem verständnis bereitstehen sollten...@tnt-tommi:
ich werde es jetzt nochmal probieren!
werde mir deine unzipfile.h anguggen, in mein projekt integrieren, wenn du meinst dass das so easy is, kann das ja net so schwer sein, oder ich bin einfach zu dumm*niemals aufgib*
stelle es mir so vor,dass ich deine unzpfile.h und deren referenzierte files in mein projekt integriere und dann nach deinem code aufrufen, ma gugen was passiert
eigentlich meinte ich auch die namespaces in deiner unzipfile.hgruß davey
p.s. danke für euren support
-
davey schrieb:
ja, das is ja das komische, die unzip.h wird in der miniunzip.c includiert, wodurch ja die funktionen nach meinem verständnis bereitstehen sollten...
Ja, in der miniunzip.c. Die kannst Du aber nicht includen, die zeigt Dir nur, wie Du die Funktionen aus unzip.h verwenden sollst.