Russian Qt Forum
Сентябрь 30, 2024, 10:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: А как собрать qt приложение с quazip static?  (Прочитано 9409 раз)
Radmir
Гость
« Ответ #15 : Май 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. См. следующее сообщение
Радмир
Записан
Radmir
Гость
« Ответ #16 : Май 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.

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


Записан
Radmir
Гость
« Ответ #17 : Май 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 проектов в том, что подчас нет удовлетворительных реализаций даже для хороших идей...

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

С уважением,

Радмир





Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 20.