Russian Qt Forum

Qt => Общие вопросы => Тема начата: vregess от Сентябрь 07, 2007, 10:42



Название: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 07, 2007, 10:42
Ситуация такая:

class A находится в a.dll
A наследуется от QThread.
В нем есть сигналы/слоты.

class B: public A и находится он в главном приложении.
У класса B есть сигнал:
Код:
class B: public A
{
  Q_OBJECT
...
signals:
  void sig(const QString &afsdf);
};

Под линуксом все работает.
В виндах вылетает окно "Ошибка инициализации приложения".
Если убрать макрос Q_OBJECT, то приложение запускается.
В чем проблема?
qt-4.2.2, mingw, g++ 3.4.2


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 10, 2007, 07:25
Провел эксперимент. Соэдал небольшой проект - 2 штуки.
Dll:
Код:
class A: public QThread
{
  Q_OBJECT
public:
  A() {}
  ~A() {}
  void run();
  virtual void proceed()=0;

signals:
  void messageInfo(const QString &message);
};

void A::run()
{
  proceed();
}

Главное приложение:
Код:
class B: public A{
  Q_OBJECT
protected:
  void proceed();

signals:
  void b_signal(const QString &info);
};

void B::proceed()
{
  emit b_signal("Hello, World!");
}

int main(int argc, char **argv)
{
  QApplication app(argc,argv);
  return app.exec();
}

Приложение вылетает с сообщением: Ошибка инициализации приложения (0xc0000005).
winXp, qt4.2.2, mingw, g++ 3.4.2
Что не так?  ???


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: Sergeich от Сентябрь 10, 2007, 12:45
А где экспорт в DLL?


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 10, 2007, 13:50
А где экспорт в DLL?

В смысле?

Разве сдесь нужен экспорт?

под лин все работает.
Да и еще есть другая dll, там класс лежит свой (не qt).
она тож работает нормально... хм :-\


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: pastor от Сентябрь 10, 2007, 15:52
Разве сдесь нужен экспорт?

под лин все работает.

Деректив экспортов\импортов под линуксом нет. Это WIN приблуда. Поэтому в линуксе все и работает.


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: Sergeich от Сентябрь 10, 2007, 16:14
В винде чтобы сделать какой-нить класс доступным из DLL, его сначала надо экспортировать:
Код:
class __declspec(dllexport) A: public QThread
на практике __declspec(dllexport) заменяют макросом типа
Код:
#ifdef Q_WS_WIN
  #define MY_EXPORT __declspec(dllexport)
#else
  #define MY_EXPORT
#endif


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 15, 2007, 07:38
хм.
Переписал заголовочный файл dll'ки:
Код:
#ifdef Q_WS_WIN
# ifdef MD_DLL
#  define MD_EXPORT __declspec(dllexport)
# endif
#endif

#ifndef MD_EXPORT
# define MD_EXPORT
#endif

class MD_EXPORT A: public QThread
{
 Q_OBJECT
public:
  A() {}
  ~A() {}
  void run();
  virtual void proceed()=0;
       
signals:
  void messageInfo(const QString &message);
       
};

Ну и добавил DEFINES+=MD_DLL

Вылетает с той же ошибкой...

PS есть у меня еще одна dll, с реализацией протокола modbus. Там нет директив импорта/экспорта у классов. Она работает под вин и линукс.

PPS Нашел пост на qtcentre. Там у парня такая же проблема. Но чет я не понял, решил ли он ее или нет. http://www.qtcentre.org/forum/f-qtopia-14/t-dll-application-6474.html (http://www.qtcentre.org/forum/f-qtopia-14/t-dll-application-6474.html)


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 17, 2007, 06:42
А тут нельзя где-нить выложить код с тестовой программой и dll? А то мож у меня проблемы не в коде, а где-нибудь в системе... Кто бы откомпиллил у себя..


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: Вячеслав от Сентябрь 17, 2007, 07:43
Кидай - гляну . ЕСли здесь низя то  v n [Г а в] s t e c h . s p b . r u


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 17, 2007, 11:42
Кидай - гляну.

Отправил.


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: ритт от Сентябрь 17, 2007, 12:10
ну экспорт ты добавил. а импорт?

Код:
#include <Qt/qglobal.h>

#ifdef MD_DLL
#define MD_EXPORT Q_DECL_EXPORT
#else
#define MD_EXPORT Q_DECL_IMPORT
#endif

что для венды будет означать:

Код:
#include <Qt/qglobal.h>

#ifdef MD_DLL
#define MD_EXPORT __declspec(dllexport)
#else
#define MD_EXPORT __declspec(dllimport)
#endif

а для лялихов - пустоту :)

когда собираешь либу, указывай DEFINES+=MD_DLL
когда линкуешься к либе - не указывай

всё. иди и наследуйся.

если это не поможет, из кода в начале предполагаю ещё затруднения...но это если не поможет :)


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: Вячеслав от Сентябрь 17, 2007, 12:32

moc_main.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const A::staticMetaObject" (?staticMetaObject@A@@2UQMetaObject@@B)
..\test_app.exe : fatal error LNK1120: 1 unresolved externals

Это VS2005 высказываеться ......


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 17, 2007, 13:07
Да. Нашел ошибку. +1 to ритт. Не дописал импорт.

У меня было:
Код:
#ifdef Q_WS_WIN
# ifdef MD_DLL
#  define MD_EXPORT __declspec(dllexport)
# endif
#endif

#ifndef MD_EXPORT
# define MD_EXPORT
#endif

Надо:
Код:
#ifdef Q_WS_WIN
# ifdef MD_MAKE_DLL
#  define MD_EXPORT __declspec(dllexport)
# elif defined(MD_DLL)
#  define MD_EXPORT __declspec(dllimport)
# endif
#endif

#ifndef MD_EXPORT
# define MD_EXPORT
#endif
MD_MAKE_DLL - для сборки библиотеки 1.
MD_DLL - при сборке приложения/библиотеки, использующего(ей) библиотеку 1.

Теперь все нормально компилится win, qt-4.2.2 opensource, mingw. Спасибо всем.

to Вячеслав: благодарствую, что не поленился откомпиллить.
Все от незнания. Под винды не знаю и не люблю писАть.
Можно закрыть.


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: ритт от Сентябрь 17, 2007, 13:23
блин...
а я только что твой тест регенерировал и собрал успешно - хотел рабочий код кинуть :)


Название: Re: [Qt 4.2.2] Наследование класса, находящегося в dll
Отправлено: vregess от Сентябрь 18, 2007, 06:26
 :) Извини) Знал бы - не постил бы решение)))