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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Qt 4.2.2] Наследование класса, находящегося в dll  (Прочитано 10087 раз)
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
Записан
vregess
Гость
« Ответ #1 : Сентябрь 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
Что не так?  Непонимающий
Записан
Sergeich
Гость
« Ответ #2 : Сентябрь 10, 2007, 12:45 »

А где экспорт в DLL?
Записан
vregess
Гость
« Ответ #3 : Сентябрь 10, 2007, 13:50 »

А где экспорт в DLL?

В смысле?

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

под лин все работает.
Да и еще есть другая dll, там класс лежит свой (не qt).
она тож работает нормально... хм В замешательстве
« Последнее редактирование: Сентябрь 10, 2007, 13:54 от vregess » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Сентябрь 10, 2007, 15:52 »

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

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Sergeich
Гость
« Ответ #5 : Сентябрь 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
Записан
vregess
Гость
« Ответ #6 : Сентябрь 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
« Последнее редактирование: Сентябрь 15, 2007, 08:34 от vregess » Записан
vregess
Гость
« Ответ #7 : Сентябрь 17, 2007, 06:42 »

А тут нельзя где-нить выложить код с тестовой программой и dll? А то мож у меня проблемы не в коде, а где-нибудь в системе... Кто бы откомпиллил у себя..
Записан
Вячеслав
Гость
« Ответ #8 : Сентябрь 17, 2007, 07:43 »

Кидай - гляну . ЕСли здесь низя то  v n [Г а в] s t e c h . s p b . r u
Записан
vregess
Гость
« Ответ #9 : Сентябрь 17, 2007, 11:42 »

Кидай - гляну.

Отправил.
Записан
ритт
Гость
« Ответ #10 : Сентябрь 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
когда линкуешься к либе - не указывай

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

если это не поможет, из кода в начале предполагаю ещё затруднения...но это если не поможет Улыбающийся
Записан
Вячеслав
Гость
« Ответ #11 : Сентябрь 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 высказываеться ......
Записан
vregess
Гость
« Ответ #12 : Сентябрь 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 Вячеслав: благодарствую, что не поленился откомпиллить.
Все от незнания. Под винды не знаю и не люблю писАть.
Можно закрыть.
Записан
ритт
Гость
« Ответ #13 : Сентябрь 17, 2007, 13:23 »

блин...
а я только что твой тест регенерировал и собрал успешно - хотел рабочий код кинуть Улыбающийся
Записан
vregess
Гость
« Ответ #14 : Сентябрь 18, 2007, 06:26 »

 Улыбающийся Извини) Знал бы - не постил бы решение)))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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