Название: [Решено] Использование статического QT4 в своей dll Отправлено: 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() Цитировать 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 Название: Re: Использование статического QT4 в своей dll Отправлено: Amigo_sa от Февраль 18, 2010, 15:16 Здравствуйте.
Я тоже прилично мучился с похожей проблемой. Опытным путем пришел к выводу, что собирать свои либы надо с теми же опциями компилятора, что и опции, указанные в сборке QT. Потому хотел бы обратить ваше внимание на флаг /Zc:wchar_t-, а так же на флаг /MDd. Вообще говоря, я считаю, что собирать статическую сборку надо без зависимостей от микрософтовских либ. Проверьте, что Qt собиралась с теми же ключами. Название: Re: Использование статического QT4 в своей dll Отправлено: neosapient от Февраль 18, 2010, 16:06 Цитировать Опытным путем пришел к выводу, что собирать свои либы надо с теми же опциями компилятора, что и опции, указанные в сборке QT. Потому хотел бы обратить ваше внимание на флаг /Zc:wchar_t-, а так же на флаг /MDd. Вообще говоря, я считаю, что собирать статическую сборку надо без зависимостей от микрософтовских либ. Проверьте, что Qt собиралась с теми же ключами. Сборку проводил командами Цитировать configure -static - fast Дополнительных ключей не вводил и не представляю, как это сделать (я о флагах /Zc:wchar_t- и /MDd). Так же не представляю, как проверить ключи в уже собранном QT. Буду благодарен, если осветите этот вопрос.nmake Знаю точно, что сразу после сборки статической QT4, собрал приведенный пример с форума. И тот пример собрался, а добавив переменную QDomDocument - проект перестал собираться. Флаги такие, как вы указали (смотри рисунок). Название: Re: Использование статического QT4 в своей dll Отправлено: Amigo_sa от Февраль 18, 2010, 16:15 Буду благодарен, если осветите этот вопрос. Мне в свое время помог этот (http://prog.org.ru/wiki/index.php?title=%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_Qt_%D0%B1%D0%B5%D0%B7_%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B5%D0%B9_%28MS_Visual_Studio%29) ресурс.Соответственно, проверить флаги текущей сборки Qt можно в файле %QtDir%mkspecs\%platform%qmake.conf Флаги такие, как вы указали (смотри рисунок) Да, я открывал ваш проект, заметил что ваша библиотека собирается со статической Qt но с динамическими runtime библиотеками и меня это насторожило :)Название: Re: Использование статического QT4 в своей dll Отправлено: neosapient от Февраль 18, 2010, 20:35 Пересобрал QT4 согласно инструкции - с флагом MT и отключенными манифестами. Теперь статический QT4 собран с флагами /Zc:wchar_t- и /MTd
Пересобрал проект (с теми же флагами) , проверил - ошибка повторяется. Обычные *.exe проекты собираются и работают без сбоев. Ткните меня в пошаговую инструкцию по сборке проектов в режиме статического QT4 для последующего использования в разработке shared dll. Модуль QtXml в итоге должен оказаться в dll-ке и использоваться только внутри неё. Помогите, а то эта "рутинная" задача уже третий день спать спокойно не дает. В чем я делаю ошибку ? Название: Re: Использование статического QT4 в своей dll Отправлено: neosapient от Февраль 19, 2010, 12:16 Медленно прихожу к мысле, что статический QT4 не позволяет сделать shared dll - статический QT4 позволяет создавать только такие же статические lib.
Жаль. Название: Re: Использование статического QT4 в своей dll Отправлено: Amigo_sa от Февраль 19, 2010, 16:52 Доброго дня!
Извините за долгий ответ - переконфигурировл статически свою сборку. Перепроверил - все работает. Причем у вас проблема не с Xml а с объектом из любой либы. Попробуйте QFile, например, создать на стеке - такая же ошибка линковки. Высылаю вам файл проекта, сконфигурированного мною, в котором у меня все собралось. Замечу, что в вашем проекте жуткая мешанина в путях инклудов и линкера =) Советую все таки использовать переменные среды и настройку версии куте в самой студии. Не исключено, что вы просто забыли в переменной PATH путь к старой версии либы. Цитировать Медленно прихожу к мысле, что статический QT4 не позволяет сделать shared dll - статический QT4 позволяет создавать только такие же статические lib Конечно, нет =) Не переживайте за Qt)Название: Re: Использование статического QT4 в своей dll Отправлено: neosapient от Февраль 19, 2010, 17:04 Цитировать Причем у вас проблема не с Xml а с объектом из любой либы. Да, это я уже понял, когда попытался создать QWidget и получил тот же набор ошибок.Покажите, пожалуйста, ваш *pro файл. Название: Re: Использование статического QT4 в своей dll Отправлено: Amigo_sa от Февраль 19, 2010, 17:33 Покажите, пожалуйста, ваш *pro файл. Я про файлики не использую, имея студийный проект. тот файлик, который я прикрепил к своему предыдущему посту надо переименовать из txt в vsproj Название: Re: Использование статического QT4 в своей dll Отправлено: neosapient от Февраль 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 ? Название: Re: Использование статического QT4 в своей dll Отправлено: neosapient от Март 22, 2010, 17:28 Наконец то собралось.
Сборку провел с ключами Цитировать configure -static -debug-and-release -fast nmake -src Затем переопределил все пути к папкам с lib-файлами Amigo_sa, спасибо за поддержку :) |