Witam,
Muszę zdekompresować plik *.odt
i wyciągnąć z niego plik content.xml
. Potrzebuję jak najprostszej w obsłudze i jak najmniejszej biblioteki, która pozwoliłaby mi tego dokonać.
Próbowałem użyć QuaZip, ale nie jestem w stanie dodać jej do projektu (non stop jakieś niezrozumiałe błędy)...
Jakieś propozycje?
Widzę, że zainteresowanie wątkiem niezbyt duże ;D No cóż, użyłem biblioteki
http://www.chilkatsoft.com/downloads_CPP.asp
Ale mam problemy z linkowaniem - dodałem ją za pomocą menu kontekstowego "Dodaj bibliotekę". Mogę includować pliki z tej biblioteki, ale kiedy tylko spróbuję np. utworzyć jakiś obiekt klasy z biblioteki to dostaję błąd:
undefined reference to `CkZip::CkZip()'
Wie ktoś jak się tego pozbyć?
[EDIT]: Na końcu błędów zawsze jest jeszcze jeden:
error: ld returned 1 exit status
Kiedy go kliknę, pod spodem na czerwono pojawia się tekst:
Brak pliku: collect2.exe
Zgodnie z tym https://en.wikipedia.org/wiki/OpenDocument_technical_specification#Format_internals to to jest ZIP w formacie takim samym jak JAR. Poszukaj bibliotek do tego (proponuję zacząć od gzip i zlib).
Spróbowałem użyć biblioteki ZipLib. Zawiera na plik "ZipFile.h" z deklaracją fukcji ZipFile::ExtractFile(...). Chciałbym jej użyć w programie nie dołączając wszystkich plików biblioteki, a jedynie ZipFile.h. Definicja funkcji ExtractFile znajduje się w ZipFile.cpp. Wrzuciłem sobie wszystkie pliki biblioteki do katalogu z programem i wklepałem:
#include "ZipLib/ZipFile.h"
Niestety, kiedy chcę użyć funkcji ExtractFile, dostaję błąd:
undefined reference to ZipFile::ExtractFile(..)
Nie linkujesz biblioteki
Tak, korzystam z Qt Creatora. PrintScreeny jak linkuję krok po kroku w załącznikach. Na koniec jeszcze zmieniam w warunkach w pliku .pro
wszystkie win32" na win64", bo mam komputer 64-bitowy (ta operacja nic nie zmienia, błędy jak przedtem były tak są). To tyle. Potem includuję np. tak:
#include "ZipFile.h"
Oto, co jest wrzucane do pliku .pro
po dołączeniu biblioteki:
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/ZipLib/ -lZipLib
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/ZipLib/ -lZipLibd
INCLUDEPATH += $$PWD/ZipLib
DEPENDPATH += $$PWD/ZipLib
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/ZipLib/libZipLib.a // <- nie mam pliku .a, a mimo to są budowane takie instrukcje... zamieniam rozszerzenia
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/ZipLib/libZipLibd.a // na .lib, żeby cokolwiek zadziałało.
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/ZipLib/ZipLib.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/ZipLib/ZipLibd.lib
To chyba jest problem tej biblioteki... pokazuje undefined reference do funkcji, ale jednocześnie traktuje pliki biblioteki jako zlinkowane z projektem (tzn. np wyświetla warningi dotyczące tych plików).
Jak korzystasz z Qt to może spróbuj użyć qUncompress
: http://qt-project.org/doc/qt-4.8/qbytearray.html#qUncompress
Znowu spróbowałem zlinkować QuaZip'a. Nie ma błędów kompilacji, ale program "nieoczekiwanie kończy pracę" od razu po uruchomieniu. Debugger wywala błąd:
During Startup program exited with code 0xc0000135
Googlowałem, dowiedziałem się, że powodem błędu może być brak pliku *.dll
biblioteki. Okazało się, że rzeczywiście takiego nie mam - pobrałem go oddzielnie i wrzuciłem do folderów z biblioteką, niestety to nie rozwiązało problemu.
Dobra, udało mi się wreszcie zlinkować QuaZip'a. Rozwiązanie bliżej nieokreślone, po prostu zadziałało ;)