Russian Qt Forum

Qt => Общие вопросы => Тема начата: Гурман от Июль 14, 2010, 11:28



Название: static приложение не собирается, не простейшая ситуация
Отправлено: Гурман от Июль 14, 2010, 11:28
структура проекта такая:
- собирается статическая библиотека .a, которая преимущественно состоит из кода на С, но имеет некоторый код на С++, и один класс, использующий классы Qt для работы с динамическими библиотеками
- собирается основное приложение, которое линкуется с предыдущей библиотекой, оно вовсю использует Qt
- собирается динамическая библиотека, которая при ее наличии в каталоге приложения опознается и загружается основным приложением (при помощи того самого класса, который в статической библиотеке), либо не загружается, если отсутствует, подобных библиотек может быть много (типа плагины но в собственном формате)

все это в варианте с shared Qt на ура собирается и замечательно работает

теперь надо собрать статический вариант, при этом допускается включение небольших библиотек в комплект, то есть, mingwm10.dll можно положить рядом, значит можно не отключать обработку исключений

статический Qt был собран следующим образом:
- дистрибутив установлен в отдельный каталог параллельно с базовой shared версией в каталог c:/Qt/2009.03.static
- в нем выполнены configure -static -debug-and-release -no-webkit -no-qt3support и mingw32-make sub-src (ключ -no-exceptions опущен, поскольку приложение вовсю использует исключения)
- не редактировал mkspecs как рекомендуется, поскольку где-то прочел, что для самих библиотек Qt это не нужно, а при сборке приложений ключ можно добавить в проект

после сборки статического Qt образовались библиотеки с похожими именами на готовые, но без индекса 4 в конце имени, и в разы больше shared, как и должно быть (только с именами не понятно, так ли должно быть):

Цитировать
14.07.2010  10:30         4 311 604 libQtCore.a
22.06.2009  16:41         2 294 384 libQtCore4.a
14.07.2010  10:28       114 143 474 libQtCored.a
22.06.2009  16:41         2 624 084 libQtCored4.a



проверено, что после установки и сборки статической версии Qt динамическая версия приложения по-прежнему нормально собирается и работает

но при попытке собрать статическую версию, собирается только библиотека .a, а сборка приложения на этапе компоновки валится с сообщениями о неудовлетворенных ссылках в этой библиотеке, ссылки на методы классов Qt такого вида

Цитировать
../dlloading.cpp:18: undefined reference to `_imp___ZN4QDirC1ERK7QStringS2_6QFlagsINS_8SortFlagEES3_INS_6FilterEE'

и

Цитировать
c:/Qt/2009.03/qt/include/QtCore/../../src/corelib/tools/qlist.h:(.text$_ZN5QListI9QFileInfoEixEi[QList<QFileInfo>::operator[]:-1: error: undefined reference to `_imp___Z11qt_assert_xPKcS0_S0_i'

как видно, ссылки в библиотеке почему-то идут на shared версию, хотя в проекте везде понаписано static, причем в Настройках запуска для QTDIR тоже указано C:/Qt/2009.03.static/qt

я даже понаписал таких ключей
Цитировать
CONFIG += staticlib \
   static
QMAKE_LFLAGS += -static \
   -LC:/Qt/2009.03.static/qt/lib

пытался в системе заменить переменную QTDIR на C:/Qt/2009.03.static/qt - не помогает, библиотека все равно собирается со ссылками на shared версию

где еще это настраивать??? что надо сделать, чтобы библиотекарь при сборке статической библиотеки компоновал ее с библиотеками в static каталоге? а может дело в чем-то другом?



Название: Re: static приложение не собирается, не простейшая ситуация
Отправлено: Гурман от Июль 14, 2010, 11:58
не... тут что-то другое, переименовывал библиотеки, добавляя суффикс 4 - перестает находить другие методы других классов по ссылке из основного приложения

что не так при сборке моей библиотеки?


Название: Re: static приложение не собирается, не простейшая ситуация
Отправлено: Гурман от Июль 14, 2010, 13:00
перенес 1 файл из проекта библиотеки в проект основного приложения - тот самый, в котором класс с неудовлетворенными ссылками - все собралось, все работает, приложение получилось статическим, нужен только mingwm10.dll из-за использования исключений

смотрю на настройки обоих проектов - они одинаковы...  ???