Название: А как собрать 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. Код
Название: Re: А как собрать qt приложение с quazip static? Отправлено: Radmir от Май 22, 2014, 09:52 До конечно, но просто копирование всех файлов приводит к несобираемоу проекту, а инклюд файлов приводит к ошибкам компиляции, которых нет при сборке родного проекта... У меня всё работает. KUbuntu 13.04. Проект состоит из main.cpp и файлов-исходников Скопированных из архива quazip. Единственное что -lz нужно добавить в LIBS, т.к. quazip использует zlib. Код
Как на странно, но у меня на 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 проектов в том, что подчас нет удовлетворительных реализаций даже для хороших идей... Все же если кто-то знает где зарыта собака буду очень признателен за информацию. С уважением, Радмир |