Russian Qt Forum

Qt => Общие вопросы => Тема начата: Dair от Август 10, 2005, 17:44



Название: (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 объявлен следующим образом:
Код:

#ifdef Q_WS_WIN
#  include <windows.h>

#  ifdef LIB1_EXPORTS
#    define LIBI1_API __declspec(dllexport)
#  else
#    define LIB1_API __declspec(dllimport)
#  endif

#else
#  define LIB1_API
#endif // Q_WS_WIN

#include "mywidget.h"

class LIB1_API  MyWidgetImpl: public MyWidget {
  Q_OBJECT
  MyWidgetImpl( QWidget * parent = NULL, const char * name = NULL );
  ...
};



В lib1.pro прописано, конечно же:
Код:

win32 {
  DEFINES += LIB1_EXPORTS
}


эти хитрые опции сделаны для того, чтобы использовать разные директивы _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

Удачи!