Russian Qt Forum
Ноябрь 26, 2024, 08:49
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
А как собрать qt приложение с quazip static?
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: А как собрать qt приложение с quazip static? (Прочитано 9514 раз)
Radmir
Гость
Re: А как собрать qt приложение с quazip static?
«
Ответ #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
Гость
Re: А как собрать qt приложение с quazip static?
«
Ответ #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
Гость
Re: А как собрать qt приложение с quazip static?
«
Ответ #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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...