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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: (win32, Qt 3.2.3) uic, dll, __dllexport  (Прочитано 5345 раз)
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 всё собирается и работает.

Заранее спасибо.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Август 10, 2005, 22:18 »

похоже ты забыл про moc файл

у тебя еще генерится что то типа moc_mywidgetimpl.cpp

туда посмотри
Записан
Dair
Гость
« Ответ #2 : Август 11, 2005, 12:13 »

Генерится, конечно. В нём всё как положено.

moc-файлы в .pro вообще не упомниаются "напрямую", там только FORMS+=mywidget.ui, и всё...
Записан
Роман Десятов
Гость
« Ответ #3 : Август 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

Удачи!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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