Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Qt и ZipArchive


Автор: ecspertiza 18.3.2009, 13:33
вот потребовалось встроить в программу работу с архивами, нашёл тут на форуме похожую тему http://forum.vingrad.ru/topic-193597.html, решил поюзать ZipArchive, стало быть скачал собрал как написано в мануале 
Код

make -f Makefile.mingw
make -f Makefile.mingw install
-f Makefile.mingw zippie


всё собралось, теперь пробую добавить в софт

Код

    CZipArchive zip;
    // open an existing archive
    zip.Open(_T("C:/LineWidget.zip"));
    // extract the first file
    zip.ExtractFile(0, _T("C:/LineWidget"));
    // extract the second file with the resulting filename changed
    zip.ExtractFile(1, _T("C:/LineWidget"), false, _T("just extracted.dat"));
    zip.Close();


в проекте дописываю

Код

LIBS =  -lziparch 


а компилятор мне нигодяй отвечает

Код

mingw32-make[1]: Entering directory `D:/MyDocument/Demki/Qt/workspace/Philately_Operator'
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,console -mthreads -Wl -o release\Philately_Operator.exe object_script.Philately_Operator.Release  -L"c:\Qt\4.5.0\lib" -lfbclient_ms -LC:/msys/1.0/lib/ -lziparch -stdc++ -lQtSql4 -lQtGui4 -lQtCore4
mingw32-make[1]: Leaving directory `D:/MyDocument/Demki/Qt/workspace/Philately_Operator'
mingw32-make: Leaving directory `D:/MyDocument/Demki/Qt/workspace/Philately_Operator'
./release\philately_operator.o:philately_operator.cpp:(.text+0x24763): undefined reference to `CZipArchive::Open(wchar_t const*, int, unsigned long)'
./release\philately_operator.o:philately_operator.cpp:(.text+0x24798): undefined reference to `CZipArchive::ExtractFile(unsigned short, wchar_t const*, bool, wchar_t const*, unsigned long)'
./release\philately_operator.o:philately_operator.cpp:(.text+0x247d0): undefined reference to `CZipArchive::ExtractFile(unsigned short, wchar_t const*, bool, wchar_t const*, unsigned long)'
collect2: ld returned 1 exit status


пол дня бьюсь нашёл похожую тему но она на французом вроде я в нём не силён http://forum.qtfr.org/viewtopic.php?id=4327
кто знает в чём грабли? 

Автор: SABROG 18.3.2009, 13:37
Цитата(ecspertiza @  18.3.2009,  13:33 Найти цитируемый пост)
LIBS =  -lziparch 

Наверно в этом:

Код

LIBS = -L/path/where/to/find/libziparch.a -lziparch

Автор: ecspertiza 18.3.2009, 13:47
то есть если я всё правильно понял то в моём случае это будет
Код

LIBS = -LC:/msys/1.0/lib/libziparch.a -lziparch


На это он говорит что неможет найти -lziparch а в катологе C:/msys/1.0/lib/ он есть

Автор: Vaulter 18.3.2009, 14:16
Код

LIBS = -LC:/msys/1.0/lib -lziparch

Автор: ecspertiza 18.3.2009, 14:32
Так тоже пробовал выводит тоже что и в первом посте.

Автор: ecspertiza 18.3.2009, 17:24
Или может знает кто хороший способ как работать с архивами (ZIP)?

Автор: SABROG 18.3.2009, 18:00
Я не работал, но вот еще такое есть http://quazip.sourceforge.net/index.html

Автор: Arch1S 18.3.2009, 18:22
SABROG, ух ты, спасибо

раньше работал с libzip, вроде всё работала

Автор: Acer 18.3.2009, 20:39
ecspertiza, а ты "LIBS +=..." писал в Makefile или в *.pro файл?

Автор: SABROG 18.3.2009, 21:19
Цитата(Acer @ 18.3.2009,  20:39)
ecspertiza, а ты "LIBS +=..." писал в Makefile или в *.pro файл?

Кстати я только после своего поста заметил, что пути уже прописаны, это видно в куске где undefined reference идет. У меня есть еще подозрение, что могло быть забыто что-то другое подключиться. А может проблема в том, что программа не в MSYS собирается и виндовая консоль не может разобрать линуксовые пути.

Узнал, что у QuaZip/minizip есть проблема, он не поддерживает поддиректории в zip архивах. Есть еще такой проект http://zziplib.sourceforge.net/

Тока он не собирается...

Цитата

Creating library file: .libs/libzzip.dll.a
/bin/sh ../libtool --silent --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I.. -I../..       -O2 -D_USE_MMAP  -fomit-frame-pointer -Wall -Wpointer-arith -Wsign-compare -Wmissing-declarations -Wdeclaration-after-statement -Werror-implicit-function-declaration -MT mmapped.lo -MD -MP -MF .deps/mmapped.Tpo -c -o mmapped.lo ../../zzip/mmapped.c
../../zzip/mmapped.c: In function `zzip_disk_mmap':
../../zzip/mmapped.c:110: error: invalid lvalue in unary `&'
../../zzip/mmapped.c: At top level:
../../zzip/__mmap.h:56: warning: 'win32_getpagesize' defined but not used
make[3]: *** [mmapped.lo] Error 1
make[3]: Leaving directory `/d/Work/zziplib-0.13.50/MINGW32_NT-5.1_1.0.11(0.46_3_2)_i686.d/zzip'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/d/Work/zziplib-0.13.50/MINGW32_NT-5.1_1.0.11(0.46_3_2)_i686.d'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/d/Work/zziplib-0.13.50/MINGW32_NT-5.1_1.0.11(0.46_3_2)_i686.d'
make: *** [all] Error 2


Автор: just_geek 18.3.2009, 22:25
Эм, вообщем в Qt 4.5.0 есть ZipReader.

Только вот...

Код

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists for the convenience
// of the QLibrary class.  This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//


qzip.cpp, qzipreader_p.h, qzipwriter_p.h

Автор: SABROG 19.3.2009, 00:41
Я так понял они его для Open Document Format сделали. Пока у них используется только QZipWriter, есть еще QZipReader, но он висит без дела.

Автор: ecspertiza 19.3.2009, 10:27
SABROG, спасибо QuaZIP то что доктор прописал)))

Автор: ecspertiza 19.3.2009, 13:42
а ктонибудь использовал QuaZIP, для приложений со статической сборкой?
при динамической сборке всё в порядке, а когда собираю статично приложение он мне пишет 
Код

d:\Qt\4.5.0\lib/libQtCore.a(deflate.o)(.text+0xe80):deflate.c: multiple definition of `deflateParams'
d:\Qt\4.5.0\lib/libquazip.a(d000126.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(deflate.o)(.text+0x1410):deflate.c: multiple definition of `deflateInit_'
d:\Qt\4.5.0\lib/libquazip.a(d000125.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(deflate.o)(.text+0x440):deflate.c: multiple definition of `deflate'
d:\Qt\4.5.0\lib/libquazip.a(d000120.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(deflate.o)(.text+0xf90):deflate.c: multiple definition of `deflateReset'
d:\Qt\4.5.0\lib/libquazip.a(d000128.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(deflate.o)(.text+0x0):deflate.c: multiple definition of `deflateEnd'
d:\Qt\4.5.0\lib/libquazip.a(d000123.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(inflate.o)(.text+0x0):inflate.c: multiple definition of `inflateReset'
d:\Qt\4.5.0\lib/libquazip.a(d000149.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(inflate.o)(.text+0x220):inflate.c: multiple definition of `inflateInit_'
d:\Qt\4.5.0\lib/libquazip.a(d000147.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(inflate.o)(.text+0x3c0):inflate.c: multiple definition of `inflate'
d:\Qt\4.5.0\lib/libquazip.a(d000142.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(inflate.o)(.text+0x1c80):inflate.c: multiple definition of `inflateEnd'
d:\Qt\4.5.0\lib/libquazip.a(d000144.o)(.text+0x0): first defined here
d:\Qt\4.5.0\lib/libQtCore.a(inflate.o)(.text+0x1ec0):inflate.c: multiple definition of `inflateSync'
d:\Qt\4.5.0\lib/libquazip.a(d000151.o)(.text+0x0): first defined here


QuaZIP пробовал тоже статично собирать, собирается нормально но ответ компилятора при сборке приложения тот же.

Автор: SABROG 20.3.2009, 15:05
В общем я развил тему классов QZipReader и QZipWriter в своем блоге: http://vingrad.ru/blogs/sabrog/2009/03/20/qt-45-rabota-s-zip-arhivami/

Автор: null56 26.3.2009, 15:52
Хотел вот чего спросить....
1) С какими вообще архиваторами можно заставить работать qt или у него свои методы сжатия, через этот QZipReader?... просто у меня еще не 4,5 я не читал про них....
2) Можно ли с помощью этих зиперов сжимать и разживать информацию не из файла в файл, а осущесвлять это все в памяти.... запись на диск мне совсем не нужна?
Заранее благодарен

Автор: just_geek 26.3.2009, 15:59
Ну вообще-то есть функции qCompress & qUncompress (используют zlib).

Автор: null56 26.3.2009, 16:03
just_geek, спасибо..... ну и как жмет, хорошо?

Автор: just_geek 26.3.2009, 16:12
ну даже не знаю smile Обычный ж zlib. Он же используется в зипе. Только учти, если будешь использовать с другим софтом, то в qUncompress нужно добавить 4 байта в начало реальный размер данных. Поидее qCompress их тоже должен в начало писать.

Автор: SABROG 26.3.2009, 23:04
Цитата(null56 @ 26.3.2009,  15:52)
Хотел вот чего спросить....
1) С какими вообще архиваторами можно заставить работать qt или у него свои методы сжатия, через этот QZipReader?... просто у меня еще не 4,5 я не читал про них....
2) Можно ли с помощью этих зиперов сжимать и разживать информацию не из файла в файл, а осущесвлять это все в памяти.... запись на диск мне совсем не нужна?
Заранее благодарен

QZipWriter/QZipReader работает на основе библиотеки zlib. Разница между zlib и zip только в заголовке с дополнительной информацией.

Если тебя не интересует загрузка и запись zip файлов, то изучи файлы:
qzip.cpp
qzipreader_p.h
qzipwriter_p.h

Там показано как работать с чистыми данными в оперативной памяти.

Автор: mosg 3.4.2009, 11:49
Цитата(ecspertiza @  19.3.2009,  13:42 Найти цитируемый пост)
QuaZIP пробовал тоже статично собирать, собирается нормально но ответ компилятора при сборке приложения тот же.


Ну как, получилось победить? На статике у меня тоже не собирается.

Автор: ecspertiza 3.4.2009, 11:53
не-а не удалось остановился на динамике, причем если собирать статически пример который вместе с QuaZIP то всё нормально а в приложении не катит smile 

Автор: mosg 7.4.2009, 15:33
Цитата(ecspertiza @  3.4.2009,  11:53 Найти цитируемый пост)
не-а не удалось остановился на динамике, причем если собирать статически пример который вместе с QuaZIP то всё нормально а в приложении не катит

А как с русским? Я пока тоже остановился на shared'е ... Исходники к своему проекту добавил - все работает, но есть две проблемы:
1) не понимает русские названия (точнее коверкает) - зы: каюсь, в код глубже ещё не заглядывал
2) при архивировании папти test, которая лежит в той же папке, что и сам EXE'шник, путь в архив пишется абсолютный! :( вместо относительного ...

Автор: mosg 7.4.2009, 16:43
Цитата(mosg @  7.4.2009,  15:33 Найти цитируемый пост)
1) не понимает русские названия (точнее коверкает) - зы: каюсь, в код глубже ещё не заглядывал

Исправилось: всего-то надо было после конструктора QuaZip добавить код:
Код
zip.setFileNameCodec("IBM866");

Автор: mosg 9.4.2009, 14:40
Цитата(ecspertiza @  3.4.2009,  11:53 Найти цитируемый пост)
не-а не удалось остановился на динамике, причем если собирать статически пример который вместе с QuaZIP то всё нормально а в приложении не катит

Я сделал немного хитро: просто добавил в свою программу исходники как QuaZIP'а, так и zlib'а - и всё статически пашет! smile

Всем советую!  smile 

Автор: spyswamp 20.11.2012, 15:03
Пардон за поднятие некропоста, но кто-нибудь имел позитивный опыт использования QZipReader/QZipWriter? Из сорцов Qt 4.7.4 выдернул qzipreader_p.h, qzipwriter_p.h, qzip.cpp и нужный ему zlib из 3rdparty.
Для подключения к своему проекту сделал qzip.pri следующего содержания:

Код

INCLUDEPATH += $$PWD

SOURCES += \
    $$PWD/qzip.cpp

HEADERS +=\
    $$PWD/qzipreader_p.h \
    $$PWD/qzipwriter_p.h


Подключаю ее к *.pro файлу так:

Код

include(../../Common/qzip/qzip.pri)


Далее в некоем *.cpp пишу:

Код

#include "qzipreader_p.h"

....
QZipReader zipReader(res.data());
QByteArray data = zipReader.fileData(fileName);
if (data.isEmpty())
{
    error("YYY"); //TODO: QZipReader::status()
    return IODevicePtr();
}
....


Получаю следующую петрушку:

Код

./debug\XXXX.o:C:\projects\XXXX.cpp:410: undefined reference to `_imp___ZN10QZipReaderC1EP9QIODevice'
./debug\XXXX.o:C:\projects\XXXX.cpp:411: undefined reference to `_imp___ZNK10QZipReader8fileDataERK7QString'
./debug\XXXX.o:C:\projects\XXXX.cpp:424: undefined reference to `_imp___ZN10QZipReaderD1Ev'
./debug\XXXX.o:C:\projects\XXXX.cpp:424: undefined reference to `_imp___ZN10QZipReaderD1Ev'

collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Exchange.exe] Error 1
mingw32-make: *** [debug] Error 2
15:55:20: The process "C:\projects\qtsdk\mingw\bin\mingw32-make.exe" exited with code 2.


Спрашивается, с какого перепугу, если qzip.cpp подключен через qzip.pri? Т.е. если тупо в *.pro добавить qzip.cpp, то ругается на повторное определение.

Автор: bsa 20.11.2012, 15:42
spyswamp, посмотри на предмет #ifdef/#endif внутри qzip.cpp.

Автор: spyswamp 20.11.2012, 17:16
bsa, да там, вроде, все предельно:

В qzip.cpp:

Код

#include <qglobal.h>

#ifndef QT_NO_TEXTODFWRITER

#include "qzipreader_p.h"
#include "qzipwriter_p.h"
#include <qdatetime.h>
#include <qplatformdefs.h>
#include <qendian.h>
#include <qdebug.h>
#include <qdir.h>

#include "zlib/zlib.h"

#if defined(Q_OS_WIN)
#  undef S_IFREG
#  define S_IFREG 0100000
#  ifndef S_IFDIR
#    define S_IFDIR 0040000
#  endif
#  ifndef S_ISDIR
#    define S_ISDIR(x) ((x) & S_IFDIR) > 0
#  endif
#  ifndef S_ISREG
#    define S_ISREG(x) ((x) & 0170000) == S_IFREG
#  endif
#  define S_IFLNK 020000
#  define S_ISLNK(x) ((x) & S_IFLNK) > 0
#  ifndef S_IRUSR
#    define S_IRUSR 0400
#  endif
#  ifndef S_IWUSR
#    define S_IWUSR 0200
#  endif
#  ifndef S_IXUSR
#    define S_IXUSR 0100
#  endif
#  define S_IRGRP 0040
#  define S_IWGRP 0020
#  define S_IXGRP 0010
#  define S_IROTH 0004
#  define S_IWOTH 0002
#  define S_IXOTH 0001
#endif

#if 0
#define ZDEBUG qDebug
#else
#define ZDEBUG if (0) qDebug
#endif

QT_BEGIN_NAMESPACE

...

QT_END_NAMESPACE

#endif // QT_NO_TEXTODFWRITER


В qzipreader_h.h:

Код

#ifndef QZIPREADER_H
#define QZIPREADER_H

#ifndef QT_NO_TEXTODFWRITER

#include <QtCore/qdatetime.h>
#include <QtCore/qfile.h>
#include <QtCore/qstring.h>

QT_BEGIN_NAMESPACE

...


QT_END_NAMESPACE

#endif // QT_NO_TEXTODFWRITER
#endif // QZIPREADER_H


Пробовал комментить QT_NO_TEXTODFWRITER и там, и там - толку ноль.

Автор: spyswamp 21.11.2012, 09:32
Убрал qzip.pri, прописал INCLUDEPATH до qzip в проекте, заинклудил только qzip.cpp, clean/rebuild - заработало.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)