Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Radmir от Май 20, 2014, 16:26



Название: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 20, 2014, 16:26
Hi всем,

может все просто, но чего-то у меня не получается, quazip цепляется как отдельная dll, а вот static не цепляется, программа все равно требует quazip.dll.
Если кто в этом преуспел, то поделитесь опытом...

Qt 4.8.2, Qt Creator 2.5.1, msvc 2010, WinXP
Qt 4.8.4, Qt Creator 2.7.1, g++, Ubuntu 13.10
С уважением,
Радмир


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: OKTA от Май 20, 2014, 16:33
как здесь делал? http://quazip.sourceforge.net/


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 20, 2014, 16:35
как здесь делал? http://quazip.sourceforge.net/
да вроде...


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: OKTA от Май 20, 2014, 17:04
Если он просит dll, видимо ты ему суешь не тот файл .a - проверь..


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 20, 2014, 17:46
Если он просит dll, видимо ты ему суешь не тот файл .a - проверь..
В том то и дело, раз просит dll, значит сборка не статическая...


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: OKTA от Май 20, 2014, 17:49
Ну, значит не по мануалу делал  ;)


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 20, 2014, 18:41
Ну, значит не по мануалу делал  ;)
Ну тогда просто распиши как это вы сделали:
-    Just copy appropriate source files to your project and use them,
- but you need to define QUAZIP_STATIC before including any QuaZIP headers (best done as a compiler option). This will save you from possible side effects of importing/exporting QuaZIP symbols.
-   Compile it as a static library using CONFIG += staticlib qmake option. QUAZIP_STATIC is defined automatically by qmake in this case.

Не напрягайтесь если не делали, а так, просто теоритизируем...


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Alex Custov от Май 20, 2014, 19:08
ну, первый пункт исключает всякие dll зависимости. Второй тоже, потому что в результате компиляции quazip получается статическая библиотека (проверил на винде). Твой проект просто неправильно настроен, поэтому откуда-то цепляет dll.


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 21, 2014, 10:51
ну, первый пункт исключает всякие dll зависимости. Второй тоже, потому что в результате компиляции quazip получается статическая библиотека (проверил на винде). Твой проект просто неправильно настроен, поэтому откуда-то цепляет dll.
До конечно, но просто копирование всех файлов приводит к несобираемоу проекту, а инклюд файлов приводит к ошибкам компиляции, которых нет при сборке родного проекта...
Как понимает, я хочу увидеть, как это сделал тот, кто делал..., если делал, а общие советы...
Радмир


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Figaro от Май 21, 2014, 10:57
Сложно проверить exe'ник дамбином или валкером? Посмотрите зависимости, если хотите статиком, значит в зависимостях не будет dll'ки... Млин детский сад....


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Alex Custov от Май 21, 2014, 11:38
До конечно, но просто копирование всех файлов приводит к несобираемоу проекту, а инклюд файлов приводит к ошибкам компиляции, которых нет при сборке родного проекта...

У меня всё работает. KUbuntu 13.04. Проект состоит из main.cpp и файлов-исходников Скопированных из архива quazip. Единственное что -lz нужно добавить в LIBS, т.к. quazip использует zlib.

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
 
#include "quazip.h"
#include "quazipfile.h"
 
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
 
   QuaZip zip("zipFile.zip");
   zip.open(QuaZip::mdUnzip);
 
   QuaZipFile file(&zip);
 
   for(bool f = zip.goToFirstFile(); f; f = zip.goToNextFile())
   {
       qDebug() << file.getActualFileName();
   }
 
   return 0;
}


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 22, 2014, 09:52
До конечно, но просто копирование всех файлов приводит к несобираемоу проекту, а инклюд файлов приводит к ошибкам компиляции, которых нет при сборке родного проекта...

У меня всё работает. KUbuntu 13.04. Проект состоит из main.cpp и файлов-исходников Скопированных из архива quazip. Единственное что -lz нужно добавить в LIBS, т.к. quazip использует zlib.

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDebug>
 
#include "quazip.h"
#include "quazipfile.h"
 
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
 
   QuaZip zip("zipFile.zip");
   zip.open(QuaZip::mdUnzip);
 
   QuaZipFile file(&zip);
 
   for(bool f = zip.goToFirstFile(); f; f = zip.goToNextFile())
   {
       qDebug() << file.getActualFileName();
   }
 
   return 0;
}

Как на странно, но у меня на Ubuntu 13.10 тоже получилось, а на винде не выходит.
Я и раньше подозревал, что для включения quazip статически, ей тоже нужны свои dll и тоже статические. Похоже, что этой опции в проекте Libs += -lz и не хватало.

Но на Ubuntu у меня появилась zDll.lib, не она ли является причиной?

На винде ее нет, и -lz она не находит...
Все равно спасибо.
Радмир


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 22, 2014, 10:04
Ну, значит не по мануалу делал  ;)
Ну тогда просто распиши как это вы сделали:
-    Just copy appropriate source files to your project and use them,
- but you need to define QUAZIP_STATIC before including any QuaZIP headers (best done as a compiler option). This will save you from possible side effects of importing/exporting QuaZIP symbols.
-   Compile it as a static library using CONFIG += staticlib qmake option. QUAZIP_STATIC is defined automatically by qmake in this case.

Не напрягайтесь если не делали, а так, просто теоритизируем...

Поскольку ответа нет, значит или никто не знает, или я чего-то не догоняю... Ну тогда поясню свои вопросы:

-    Just copy appropriate source files to your project and use them,
     Нужно действительно скопировать все *.h и dct *.cpp файлы, или достаточно просто присодинить их к проекту (Qt Creator позволяет это)
- but you need to define QUAZIP_STATIC before including any QuaZIP headers
   нужно в *.h файле вашего проекта вставить:

#define QUAZIP_STATIC
#include "quazip.h"

(best done as a compiler option).
- а это как? 
    Это в нашем проекте?
    где в команде QtCreatora
qmake.exe C:\Qt\MyQt4Projects\Rednote\Rednote.pro -r -spec win32-msvc2010 "CONFIG+=declarative_debug"
This will save you from possible side effects of importing/exporting QuaZIP symbols.
-   Compile it as a static library using CONFIG += staticlib qmake option. QUAZIP_STATIC is defined automatically by qmake in this case.


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Alex Custov от Май 22, 2014, 11:40
Я и раньше подозревал, что для включения quazip статически, ей тоже нужны свои dll и тоже статические.

Статическая dll - это оксюморон. Как ручная АКПП. Разберись в терминах и азах компиляции. Без этого никуда, а ты уже лезешь в дебри.

Но на Ubuntu у меня появилась zDll.lib, не она ли является причиной?

Не знаю что такое zDll.lib и откуда она взялась на Ubuntu.

Нужно действительно скопировать все *.h и dct *.cpp файлы, или достаточно просто присодинить их к проекту (Qt Creator позволяет это)

Если просто присоединишь из какого-то другого каталога, то придётся ещё и прописывать пути поиска инклудов. Поэтому их нужно скопировать в каталог с проектом и присоединить к проекту.

На винде ее нет, и -lz она не находит...

По той банальной причине что zlib на винде не установлена и её нужно поставить вместе с заголовочными файлами для используемого компилятора.

(best done as a compiler option).
- а это как?

"DEFINES += QUAZIP_STATIC" в pro файле.

Это в нашем проекте?

Естественно в нашем, в каком же ещё??

P.S. Я вообще в шоке что приходится объяснять такие азы. Изучи сперва процесс компиляции, qmake и его флаги, и только потом уже занимайся всем остальным. Иначе твои хождения на форум будут бесконечными.


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 29, 2014, 07:23
Попробую сформулировать, что получилось, сначала с советами последнего доброжелателя:

Я и раньше подозревал, что для включения quazip статически, ей тоже нужны свои dll и тоже статические.

Статическая dll - это оксюморон. Как ручная АКПП. Разберись в терминах и азах компиляции. Без этого никуда, а ты уже лезешь в дебри.
Не знаю, что такое окзюморок, а без этого, пытаться разобраться в терминах компиляции вообще отстой!

Но на Ubuntu у меня появилась zDll.lib, не она ли является причиной?

Не знаю что такое zDll.lib и откуда она взялась на Ubuntu.

 Согласен, эта длл попала от предущих попыток использовать zip/unzip, в чистом виде она не нужна

Нужно действительно скопировать все *.h и dct *.cpp файлы, или достаточно просто присодинить их к проекту (Qt Creator позволяет это)

Если просто присоединишь из какого-то другого каталога, то придётся ещё и прописывать пути поиска инклудов. Поэтому их нужно скопировать в каталог с проектом и присоединить к проекту.

 Нет, потому что Qt Creator все за вас делает: присоединяет файлы к проекту и прописывает инклуды

На винде ее нет, и -lz она не находит...

По той банальной причине что zlib на винде не установлена и её нужно поставить вместе с заголовочными файлами для используемого компилятора.

Просто на винде нужна zlib, которой нет в стандартной поставке (она нужна вместе с *.h, *.cpp файлами, но она есть в Qt в каталоге $QTDIR/src/3rdparty/zlib...

(best done as a compiler option).
- а это как?

"DEFINES += QUAZIP_STATIC" в pro файле.

Это в нашем проекте?

Естественно в нашем, в каком же ещё??

Тоже без объяснения где и когда, смотри следующие пояснения

P.S. Я вообще в шоке что приходится объяснять такие азы. Изучи сперва процесс компиляции, qmake и его флаги, и только потом уже занимайся всем остальным. Иначе твои хождения на форум будут бесконечными.
Ну а это вооще лирика, просто перечень пустых советов, можете сколько угодно зубрить теорию, но хорошо плавать в реальности. Насчет форума, абсолютная правда, как говорил Норберт Винер, легче самому создать новую теорию, чем получить нужную консультацию. Со времени развала ФИДО такое происходит со всеми форумами...
Далее моя теория:



Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 29, 2014, 07:29
Начнем с инструкции:
Инструкция:
- Just copy appropriate source files to your project and use them,
- but you need to define QUAZIP_STATIC before including any QuaZIP headers (best done as a compiler option). This will save you from possible side effects of importing/exporting QuaZIP symbols.
- Compile it as a static library using CONFIG += staticlib qmake option. QUAZIP_STATIC is defined automatically by qmake in this case.

после моего перевода на русский выглядит так:

- Просто скопируйте файлы исходников в ваш проект и используйте их,
- но вам нужно задать (определить) переменную QUAZIP_STATIC до включения любого заголовка (h - файла) QuaZIP (лучше сделать это с помощью опции компилятора) . Это предохранит вас от возможных побочных эффектов импорта/экспорта символов QuaZIP.
- Скомпилируйте его как статическую библиотеку используя опцию qmake CONFIG += staticlib. QUAZIP_STATIC в этом случае задается qmake-ом автоматически .

Вроде простая инструкция, однако, в силу особенностей естесственного языка, а он, как известно, просто не может быть точным, здесь спрятаны подводные камни.

- скопировать не составляет проблемы, однако будьте готовы получить несметное количество сообщений, типа incompatible dll linking type, redefinition types, reference not found и т.д.

- задать (определить) переменную QUAZIP_STATIC до включения любого заголовка (h - файла) QuaZIP

Можно, например, вставить перед #include <quazip.h> что-то типа #define QUAZIP_STATIC. Поможет это или нет, это потом.

Другой вариант предлагает сделать это с помощью опции компилятора. Должно быть автор считает qmake компилятором, я всегда думал, что программка просто преобразует один Makefile в другие, Makefile.Release и Makefile.Debug с помощью вашего проекта, а компилятором является что-то типа mingw, gcc, g++, на худой конец jom, который объединяет в себе и компилятор и make... Так вот, у этих компиляторов такой опции нет.

В данном случае речь все же идет о том, чтобы вы вставлили в ваш проект DEFINES += QUAZIP_STATIC и при сборке эта переменная будет задана. Если же вы собираете под MSVC, то также в ваш проект вставьте DEFINES += QUAZIP_BUILD, иначе ваш проект откомпилит ваши модули из QuaZIP как у разделяемой dll!

Первый пункт предложения подразумевает, что вы не будете использовать статическую dll в классическом понимании, а просто все ее функции вставите в проект, и они станут частью вашей программы.

Второй пункт никакого отношения к первому не имеет, он предполагает, что вы соберете статическую библиотеку, и потом прилинкуете к своему проекту.

Ну а теперь, как это выглядит в реальности с quazip. См. следующее сообщение
Радмир


Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 29, 2014, 10:19
Прежде всего, мы имеем часть функционала, оформленного в виде dll, который мы хотим использовать в своей программе.
Это можно сделать несколькими способами:

1.Скопировать все исходные коды в ваш проект, тогда про dll можно просто забыть - весь функционал у вас в программе и сама dll просто не нужна

2.Создать dll и использовать ее как совместно используемую, хотя скорее всего только вы ее и будете использовать, вы можете написать несколько программ, поставить их на одну машину и сэкономить таким образом немного места. Вполне распространненый способ, нужно только позаботиться о том, чтобы было известно, где лежит ваша dll, под виндой включите путь к ней в переменную path, или держите ее в каталоге программы. Под Ubuntu ваша dll превращается в саму dll и несколько линков, которые придется разместить в специально предназначенный для этого каталог, например, /usr/lib. Для этого скорее всего потребуются права администратора. Ну это не сложно.

3.Создать статическую dll и прилинковать ее к вашей программе на этапе сборки. Собственно говоря это и есть, то, о чем говорять - используется статическая библиотека.



Все это несколько осложняется различными особенностями ОС, интегрированных сред сборки, компиляторами, и т.д.

Здесь я попробую описать как собирать quazip.dll в среде WinXP + Qt 4.8.2 + Qt Creator 2.5.1. + MSVC2010.

Вот мои шаги по реализации.

1. Скопировать все исходные коды в ваш проект, тогда про dll можно просто забыть - весь функционал у вас в программе и сама dll просто не нужна

- скопировать не составляет проблемы, однако будьте готовы получить несметное количество сообщений, типа incompatible dll linking type, redefinition types, reference not found и т.д. Если в качестве тесового проекта возьмете qztest.pro будьте готовы к дполнительным неприятностям, связанным с переопределением строки zip_copyright. Лучше взять свой простой проект, с простым использованием нужных вам функций, типа zip, archive. extract_all,...Если будете включать по одному файлу *.h, *.cpp, то немного помучившись, вы сможете что-то такое собрать в одном месте, и которое может даже будет компилироваться. Плюсом, будет то, что в вашем проекте будут только те модули, которые реально нужны вам. Но надеюсь, немного помыкавшись, вы сделаете так, как сделал я:

- открыл проект вашей программы с помощью Qt Creatora.

- на проекте нажал правую кнопку мыши и добавил все *.h, *.c, *.cpp файлы проекта quazip.

- открыл файл *.pro нашей программы и ручками вставил DEFINES += QUAZIP_BUILD - нужно, если используется MSVC (особенность кодов quazip!)

- открыл файл *.pro нашей программы и ручками вставил DEFINES += QUAZIP_STATIC - нужно, чтобы подавить определения DLL_EXPORT

- в проекте уже должны быть, а если нет - вставьте INCLUDEPATH += $$PWD/../quazip - $$PWD - каталог текущего проекта; quazip в соседнем с проектом каталоге

- вставьте, если нет, строку DEPENDPATH += $$PWD/../quazip, чтобы Creator знал, что для этого проекта нужен каталог quazip

- вставьте INCLUDEPATH += ../../4.8.2/src/3rdparty/zlib - без исходников zlib quazip работать не будет, ведь quazip всего лишь обертка zip! Возможно у вас будет в проекте стоять
win32 {
# workaround for qdatetime.h macro bug
DEFINES += NOMINMAX - если вы сомневаетесь, так же вставьте это определение
INCLUDEPATH += C:/Qt/4.8.2/src/3rdparty/zlib
}
тогда эту строку можно не вставлять.

- Уберите или закомментируйте строки вида
#win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../quazip/release/ -lquazip
#else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../quazip/debug/ -lquazip

#else:unix: LIBS += -L$$OUT_PWD/../quazip/ -lquazip



В итоге ваш проект будет выглядеть так:

#-------------------------------------------------
#
# Project created by QtCreator 2014-02-04T10:41:29
#
#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ProgramName
TEMPLATE = app

DEFINES += QUAZIP_BUILD
DEFINES += QUAZIP_STATIC

INCLUDEPATH += $$PWD/../quazip
INCLUDEPATH += ../../4.8.2/src/3rdparty/zlib

DEPENDPATH += $$PWD/../quazip

SOURCES += main.cpp\
mainwindow.cpp \
../quazip/quazipfileinfo.cpp \
../quazip/quazipfile.cpp \
../quazip/quazipdir.cpp \
../quazip/quazip.cpp \
../quazip/quaziodevice.cpp \
../quazip/quagzipfile.cpp \
../quazip/quacrc32.cpp \
../quazip/quaadler32.cpp \
../quazip/qioapi.cpp \
../quazip/JlCompress.cpp \
../quazip/zip.c \
../quazip/unzip.c \
../quazip/quazipnewinfo.cpp

HEADERS += mainwindow.h \
../quazip/zip.h \
../quazip/unzip.h \
../quazip/quazipnewinfo.h \
../quazip/quazipfileinfo.h \
../quazip/quazipfile.h \
../quazip/quazipdir.h \
../quazip/quazip_global.h \
../quazip/quazip.h \
../quazip/quaziodevice.h \
../quazip/quagzipfile.h \
../quazip/quacrc32.h \
../quazip/quachecksum32.h \
../quazip/quaadler32.h \
../quazip/JlCompress.h \
../quazip/ioapi.h \
../quazip/crypt.h
HEADERS +=

win32 {
# workaround for qdatetime.h macro bug
DEFINES += NOMINMAX
INCLUDEPATH += C:/Qt/4.8.2/src/3rdparty/zlib
}

FORMS += mainwindow.ui

Надеюсь, это поможет вам осуществить способ 1.
Второй способ, наверное, приводить нет смысла, далее я приведу, что и как нужно делать при способе 3 в той же среде WinXP + Qt 4.8.2 + Qt Creator 2.5.1. + MSVC2010.

С уважением,
Радмир




Название: Re: А как собрать qt приложение с quazip static?
Отправлено: Radmir от Май 30, 2014, 09:04
Ниже я опишу, что удалось сделать по классическому использованию статической библиотеки в среде WinXP + Qt 4.8.2 + Qt Creator 2.5.1. + MSVC2010.

Нашей целью является автономно собрать наш проект и подключить к нему статическую библиотеку quazip.

Сделать это довольно просто:

Откройте ваш проект, и добавьте к нему библиотеку quazip (нажмите правую кнопку мыши - надеюсь у вас не Mac  :), выберите add dll, тип external и укажите путь к каталогу, в котором содержится ваша quazip). После добавления ваш проект видоизменится и будет содержать все необходимые пути и указания по сборке. Последних будет два множества: одно подключает в LIBS quazip, другое - PRE_TARGETDEPS подключает вашу quazip.lib

Вот здесь начинается самое интересное:

По идее ваша quazip должна быть статической, а именно, она должна быть собрана с указанием в ее проекте CONFIG+= staticlib. В этом случае на выходе будет библиотека quazip.lib, которая содержит все, что нужно внутри себя.

Однако, Qt не будет работать с этой библиотекой, единственный вариант, при котором он будет работать - это собрать quazip как обычную, совместно используемую dll; в этом случае у вас на выходе будет quazip.lib значительно меньшего размера и quazip.dll, и тогда ваше приложение будет работать.

Если бы вы собирали в MSVC без Qt, то все бы получилось, как описано в классике. Но в Qt облом - без quazip.dll ваша сборка не будет работать.

Получается полностью искажен смысл статической dll. Это и есть причина появления этого вопроса. К сожалению, вся беда Open source проектов в том, что подчас нет удовлетворительных реализаций даже для хороших идей...

Все же если кто-то знает где зарыта собака буду очень признателен за информацию.

С уважением,

Радмир