Russian Qt Forum
Ноябрь 27, 2024, 02:44
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
[Решено] Использование статического QT4 в своей dll
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: [Решено] Использование статического QT4 в своей dll (Прочитано 7834 раз)
neosapient
Гость
[Решено] Использование статического QT4 в своей dll
«
:
Февраль 18, 2010, 13:46 »
Здравствуйте.
Есть чужая программа, которую можно расширять посредством dll. Программа не использует QT4.
В своей dll-ке я хочу использовать файл инициализации - в виде xml. По этому решил прикрутить объекты из QtXml.
Cделал статическую сборку QT4 (configure -static).
Далее в качестве теста собрал проект из первого поста
http://www.prog.org.ru/topic_2354_0.html
После определенных мытарств проект собрался. Но стоило мне только добавить создание переменной QDomDocument, как сразу получил ошибку
Код:
QTDLL_API void Test()
{
QDomDocument domDocument;
}
Цитировать
1>QtDll.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QDomDocument::~QDomDocument(void)" (__imp_??1QDomDocument@@QAE@XZ) referenced in function "void __cdecl Test(void)" (?Test@@YAXXZ)
1>QtDll.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QDomDocument::QDomDocument(void)" (__imp_??0QDomDocument@@QAE@XZ) referenced in function "void __cdecl Test(void)" (?Test@@YAXXZ)
Уже два дня бьюсь над вопросом,
как заставить линковщик статически подкрутить объект QDomDocument из статической библиотеки QtXml.lib ?
Архив с тестовым примером в приложении.
--------
Дополнительные сведения:
Windows XP SP2 x64,
VC9
QT4.6.2 static
«
Последнее редактирование: Март 22, 2010, 17:29 от neosapient
»
Записан
Amigo_sa
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #1 :
Февраль 18, 2010, 15:16 »
Здравствуйте.
Я тоже прилично мучился с похожей проблемой. Опытным путем пришел к выводу, что собирать свои либы надо с теми же опциями компилятора, что и опции, указанные в сборке QT. Потому хотел бы обратить ваше внимание на флаг /Zc:wchar_t-, а так же на флаг /MDd. Вообще говоря, я считаю, что собирать статическую сборку надо без зависимостей от микрософтовских либ.
Проверьте, что Qt собиралась с теми же ключами.
«
Последнее редактирование: Февраль 18, 2010, 15:18 от Amigo_sa
»
Записан
neosapient
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #2 :
Февраль 18, 2010, 16:06 »
Цитировать
Опытным путем пришел к выводу, что собирать свои либы надо с теми же опциями компилятора, что и опции, указанные в сборке QT. Потому хотел бы обратить ваше внимание на флаг /Zc:wchar_t-, а так же на флаг /MDd. Вообще говоря, я считаю, что собирать статическую сборку надо без зависимостей от микрософтовских либ.
Проверьте, что Qt собиралась с теми же ключами.
Сборку проводил командами
Цитировать
configure -static - fast
nmake
Дополнительных ключей не вводил и не представляю, как это сделать (я о флагах
/Zc:wchar_t-
и
/MDd
). Так же не представляю, как проверить ключи в уже собранном QT.
Буду благодарен, если осветите этот вопрос.
Знаю точно, что сразу после сборки статической QT4, собрал приведенный пример с форума. И тот пример собрался, а добавив переменную QDomDocument - проект перестал собираться.
Флаги такие, как вы указали (смотри рисунок).
«
Последнее редактирование: Февраль 18, 2010, 16:22 от neosapient
»
Записан
Amigo_sa
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #3 :
Февраль 18, 2010, 16:15 »
Цитата: neosapient от Февраль 18, 2010, 16:06
Буду благодарен, если осветите этот вопрос.
Мне в свое время помог
этот
ресурс.
Соответственно, проверить флаги текущей сборки Qt можно в файле %QtDir%mkspecs\%platform%qmake.conf
Цитата: neosapient от Февраль 18, 2010, 16:06
Флаги такие, как вы указали (смотри рисунок)
Да, я открывал ваш проект, заметил что ваша библиотека собирается со статической Qt но с динамическими runtime библиотеками и меня это насторожило
«
Последнее редактирование: Февраль 18, 2010, 16:18 от Amigo_sa
»
Записан
neosapient
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #4 :
Февраль 18, 2010, 20:35 »
Пересобрал QT4 согласно инструкции - с флагом MT и отключенными манифестами. Теперь статический QT4 собран с флагами /Zc:wchar_t- и /MTd
Пересобрал проект (с теми же флагами) , проверил - ошибка повторяется.
Обычные *.exe проекты собираются и работают без сбоев.
Ткните меня в пошаговую инструкцию по сборке проектов в режиме статического QT4 для последующего использования в разработке shared dll. Модуль QtXml в итоге должен оказаться в dll-ке и использоваться только внутри неё.
Помогите, а то эта "рутинная" задача уже третий день спать спокойно не дает. В чем я делаю ошибку ?
Записан
neosapient
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #5 :
Февраль 19, 2010, 12:16 »
Медленно прихожу к мысле, что статический QT4 не позволяет сделать shared dll - статический QT4 позволяет создавать только такие же статические lib.
Жаль.
Записан
Amigo_sa
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #6 :
Февраль 19, 2010, 16:52 »
Доброго дня!
Извините за долгий ответ - переконфигурировл статически свою сборку. Перепроверил - все работает. Причем у вас проблема не с Xml а с объектом из любой либы. Попробуйте QFile, например, создать на стеке - такая же ошибка линковки.
Высылаю вам файл проекта, сконфигурированного мною, в котором у меня все собралось.
Замечу, что в вашем проекте жуткая мешанина в путях инклудов и линкера =) Советую все таки использовать переменные среды и настройку версии куте в самой студии. Не исключено, что вы просто забыли в переменной PATH путь к старой версии либы.
Цитировать
Медленно прихожу к мысле, что статический QT4 не позволяет сделать shared dll - статический QT4 позволяет создавать только такие же статические lib
Конечно, нет =) Не переживайте за Qt)
Записан
neosapient
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #7 :
Февраль 19, 2010, 17:04 »
Цитировать
Причем у вас проблема не с Xml а с объектом из любой либы.
Да, это я уже понял, когда попытался создать QWidget и получил тот же набор ошибок.
Покажите, пожалуйста, ваш *pro файл.
«
Последнее редактирование: Февраль 19, 2010, 17:15 от neosapient
»
Записан
Amigo_sa
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #8 :
Февраль 19, 2010, 17:33 »
Цитата: neosapient от Февраль 19, 2010, 17:04
Покажите, пожалуйста, ваш *pro файл.
Я про файлики не использую, имея студийный проект. тот файлик, который я прикрепил к своему предыдущему посту надо переименовать из txt в vsproj
Записан
neosapient
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #9 :
Февраль 22, 2010, 17:08 »
Тут где то спятано мое глубокое не понимание сборки shared dll из статических библиотек.
По какой то причине нельзя организовать в стеке память под переменную, но можно задать указатеть и выделить нужную память в куче.
При этом ошибки заменяются на переменные
Цитировать
1>QtDll.obj : warning LNK4217: locally defined symbol ??0QWidget@@QAE@PAV0@V?$QFlags@W4WindowType@Qt@@@@@Z (public: __thiscall QWidget::QWidget(class QWidget *,class QFlags<enum Qt::WindowType>)) imported in function "void __cdecl Test(void)" (?Test@@YAXXZ)
1>QtDll.obj : warning LNK4217: locally defined symbol ??1QWidget@@UAE@XZ (public: virtual __thiscall QWidget::~QWidget(void)) imported in function "public: virtual void * __thiscall QWidget::`scalar deleting destructor'(unsigned int)" (??_GQWidget@@UAEPAXI@Z)
----- 10 минут спустя -----
Но даже при использовании указателя, на линковщик ругается на конструктор QDomDocument
error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QDomDocument::QDomDocument(void)" (__imp_??0QDomDocument@@QAE@XZ) referenced in function "void __cdecl Test(void)" (?Test@@YAXXZ)
----- ещё 10 минут спустя -----
Может мне надо как то хитрее пересобрать QT4 в статическом режиме, чтобы в процессе сборки фигурировал ключ Q_XML_EXPORT ?
«
Последнее редактирование: Февраль 22, 2010, 17:40 от neosapient
»
Записан
neosapient
Гость
Re: Использование статического QT4 в своей dll
«
Ответ #10 :
Март 22, 2010, 17:28 »
Наконец то собралось.
Сборку провел с ключами
Цитировать
configure -static -debug-and-release -fast
nmake -src
Затем переопределил все пути к папкам с lib-файлами
Amigo_sa
, спасибо за поддержку
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
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 сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...