Название: (win32, Qt 3.2.3) uic, dll, __dllexport Отправлено: Dair от Август 10, 2005, 17:44 Здравствуйте.
Столкнулся с проблемой следующего характера: Надо собрать две разных библиотеки, первая использует вторую. Под linux проблем никаких, под win32 - беда. Используемые дистрибутивы: Qt 3.2.3, MSVC++ 6.0, Windows 2003 Server Библиотека 1: (lib1) mywidget.ui mywidgetimpl.h mywidgetimpl.cpp -- порождены uic'ом из mywidget.ui с дальнейшей модификацией вручную. в mywidgetimpl.h класс MyWidgetImpl объявлен следующим образом: Код:
В lib1.pro прописано, конечно же: Код:
эти хитрые опции сделаны для того, чтобы использовать разные директивы _dllexport/__dllimport, когда этот же h-файл подключается изнутри/извне. Собирается это всё на ура, совершенно спокойно. Но. При попытке собрать что-либо с получившейся библиотекой на стадии сборки (linking) выдаёт следующее: "otherwidgetimpl.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall MyWidget::languageChange(void)" (?languageChange@MyWidget@@MAEXXZ)" Где я что забыл?.. Под linux/Qt 3.2.3 всё собирается и работает. Заранее спасибо. Название: (win32, Qt 3.2.3) uic, dll, __dllexport Отправлено: Admin от Август 10, 2005, 22:18 похоже ты забыл про moc файл
у тебя еще генерится что то типа moc_mywidgetimpl.cpp туда посмотри Название: (win32, Qt 3.2.3) uic, dll, __dllexport Отправлено: Dair от Август 11, 2005, 12:13 Генерится, конечно. В нём всё как положено.
moc-файлы в .pro вообще не упомниаются "напрямую", там только FORMS+=mywidget.ui, и всё... Название: (win32, Qt 3.2.3) uic, dll, __dllexport Отправлено: Роман Десятов от Август 18, 2005, 18:27 Так и должно быть. Виртуальная функция languageChange не перегружена в дочернем классе MyWidgetImpl, следовательно используется ее реализация из базового класса - того, который генерит uic. А в нем, в объявлении класса, нет директивы экспорта (например ваше LIB1_API ).
Вывод: 1 Вариант: сделать реализацию languageChange в MyWidgetImpl. 2 Вариант: добавить директиву экспорта для родительского класса. Это делается из дизайнера, на тулбаре свойств, в самом первом поле name - там где имя класса задается. Разверните ветку дерева и увидите подпункт export macro - можете туда вписать LIB1_API. Конечно же компилятор не будет знать откуда брать этот макрос, для этого надо указать .h файл в поле "Includes in Declaration". Это делается на тулбаре Object Explorer, закладка Members Удачи! |