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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Использование статического QT4 в своей dll  (Прочитано 7843 раз)
neosapient
Гость
« : Февраль 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
Гость
« Ответ #1 : Февраль 18, 2010, 15:16 »

Здравствуйте.
Я тоже прилично мучился с похожей проблемой. Опытным путем пришел к выводу, что собирать свои либы надо с теми же опциями компилятора, что и опции, указанные в сборке QT. Потому хотел бы обратить ваше внимание на флаг /Zc:wchar_t-, а так же на флаг /MDd. Вообще говоря, я считаю, что собирать статическую сборку надо без зависимостей от микрософтовских либ.

Проверьте, что Qt собиралась с теми же ключами.
« Последнее редактирование: Февраль 18, 2010, 15:18 от Amigo_sa » Записан
neosapient
Гость
« Ответ #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
Гость
« Ответ #3 : Февраль 18, 2010, 16:15 »

Буду благодарен, если осветите этот вопрос.
Мне в свое время помог этот ресурс.
Соответственно, проверить флаги текущей сборки Qt можно в файле %QtDir%mkspecs\%platform%qmake.conf

Флаги такие, как вы указали (смотри рисунок)
Да, я открывал ваш проект, заметил что ваша библиотека собирается со статической Qt но с динамическими runtime библиотеками и меня это насторожило Улыбающийся
« Последнее редактирование: Февраль 18, 2010, 16:18 от Amigo_sa » Записан
neosapient
Гость
« Ответ #4 : Февраль 18, 2010, 20:35 »

Пересобрал QT4 согласно инструкции - с флагом MT и отключенными манифестами. Теперь статический QT4 собран с флагами /Zc:wchar_t- и /MTd
Пересобрал проект (с теми же флагами) , проверил - ошибка повторяется.

Обычные *.exe проекты собираются и работают без сбоев.
Ткните меня в пошаговую инструкцию по сборке проектов в режиме статического QT4 для последующего использования в разработке shared dll. Модуль QtXml в итоге должен оказаться в dll-ке и использоваться только внутри неё.

Помогите, а то эта "рутинная" задача уже третий день спать спокойно не дает. В чем я делаю ошибку ?
Записан
neosapient
Гость
« Ответ #5 : Февраль 19, 2010, 12:16 »

Медленно прихожу к мысле, что статический QT4 не позволяет сделать shared dll - статический QT4 позволяет создавать только такие же статические lib.

Жаль.
Записан
Amigo_sa
Гость
« Ответ #6 : Февраль 19, 2010, 16:52 »

Доброго дня!
Извините за долгий ответ - переконфигурировл статически свою сборку. Перепроверил - все работает. Причем у вас проблема не с Xml а с объектом из любой либы. Попробуйте QFile, например, создать на стеке - такая же ошибка линковки.
Высылаю вам файл проекта, сконфигурированного мною, в котором у меня все собралось.
Замечу, что в вашем проекте жуткая мешанина в путях инклудов и линкера =) Советую все таки использовать переменные среды и настройку версии куте в самой студии. Не исключено, что вы просто забыли в переменной PATH путь к старой версии либы.

Цитировать
Медленно прихожу к мысле, что статический QT4 не позволяет сделать shared dll - статический QT4 позволяет создавать только такие же статические lib
Конечно, нет =) Не переживайте за Qt)
Записан
neosapient
Гость
« Ответ #7 : Февраль 19, 2010, 17:04 »

Цитировать
Причем у вас проблема не с Xml а с объектом из любой либы.
Да, это я уже понял, когда попытался создать QWidget и получил тот же набор ошибок.

Покажите, пожалуйста, ваш *pro файл.
« Последнее редактирование: Февраль 19, 2010, 17:15 от neosapient » Записан
Amigo_sa
Гость
« Ответ #8 : Февраль 19, 2010, 17:33 »

Покажите, пожалуйста, ваш *pro файл.

Я про файлики не использую, имея студийный проект. тот файлик, который я прикрепил к своему предыдущему посту надо переименовать из txt в vsproj
Записан
neosapient
Гость
« Ответ #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
Гость
« Ответ #10 : Март 22, 2010, 17:28 »

Наконец то собралось.

Сборку провел с ключами
Цитировать
configure -static -debug-and-release -fast
nmake -src

Затем переопределил все пути к папкам с lib-файлами

Amigo_sa, спасибо за поддержку  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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