Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DLL на Windows, Ошибка при использовании библиотеки DLL 
V
    Опции темы
loneybibi
Дата 19.4.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Доброго времени суток, уважаемые!
Столкнулся с проблемой при использовании динамических библиотек на Windows.
Код полностью собирается и под windows xp(4.7.0) и под linux (Qt 4.6.2).
Так вот программа динамически подключает библиотеку и использует ее функцию.
В linux все отлично. 

Но запустив приложение на windows вылетает ошибка,
после чего приложение тухнет с кодом -1073741819. В режиме отладки выяснил
текст ошибки: Приложение было остановлено поскольку оно получило сигнал от ОС
Signal- SIGSEGV , назначение - Segmentation fault.

Приложение и библиотека собраны под одним компилятором.
В программе есть главное окно с QMdiArea и туда из библиотеки загружается QFrame.
Именно в этот момент в виндовс вылетает ошибка.

Вот так вызываю функцию из библиотеки:
Код

   QLibrary lib("frame.dll");
    lib.load();
    qDebug()<<lib.errorString();
    qDebug()<<lib.isLoaded();

    qDebug()<<"step1";
    typedef QFrame* (*funct)();
    qDebug()<<"step2";
    funct fct=(funct)(lib.resolve("createframe"));
    qDebug()<<"step3";
    QMdiSubWindow *sw=ui->mdiArea->addSubWindow(fct()); //ВОТ ТУТ ВЫЛЕТАЕТ
    qDebug()<<"step4";
    sw->show();


Вот так декларирую открытую функцию библиотеки:
Код

extern "C" {
    void createwin();
    QFrame* createframe();
}


Сама функция фрейма в библиотеке:
Код

QFrame * createframe()
{
    FrameWin *nf=new FrameWin;
    return(nf);
}


Причем это с обеими функциями так. Что на той что на той вылетает! :( 

Ниже прикрепил архивчик с проектами.

Это сообщение отредактировал(а) loneybibi - 19.4.2011, 11:19

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  testlib.zip 4,30 Kb


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
Artemon
Дата 19.4.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 2
Всего: 20



Добавьте проверку:

if( !fct )
{
printf("error");
return;
}


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
loneybibi
Дата 19.4.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(Artemon @ 19.4.2011,  10:20)
Добавьте проверку:

if( !fct )
{
printf("error");
return;
}

да если добавить проверку пишет ошибку .. но почему не вкурил .. вроде все ж делаю как положено да и на линукс аналогичный код работает без нареканий .


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 19.4.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(loneybibi @  19.4.2011,  11:09 Найти цитируемый пост)

extern "C" {
    void createwin();
    QFrame* createframe();
}

у тебя эти функции не экспортируются, и lib.resolve должна возвращать 0.
сделай в dll-ке так
Код

extern "C" {
    FRAMESHARED_EXPORT void createwin();
    FRAMESHARED_EXPORT QFrame* createframe();
}


Добавлено через 2 минуты и 30 секунд
а вот почему они экспортируются на линуксе - загадка. не должны


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
loneybibi
  Дата 19.4.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



Цитата(borisbn @ 19.4.2011,  11:40)
Цитата(loneybibi @  19.4.2011,  11:09 Найти цитируемый пост)

extern "C" {
    void createwin();
    QFrame* createframe();
}

у тебя эти функции не экспортируются, и lib.resolve должна возвращать 0.
сделай в dll-ке так
Код

extern "C" {
    FRAMESHARED_EXPORT void createwin();
    FRAMESHARED_EXPORT QFrame* createframe();
}


Добавлено @ 12:42
а вот почему они экспортируются на линуксе - загадка. не должны

Спасибо за помощь так все работает! 
да действительно не понятно почему в линукс работает.. 
хотя это вроде ж стандарт описания функций С по всем книжкам .. 
я просто просмотрел пару книг по Qt ... Макс Шлее описывал длл функции так же.. и по идее я думаю у него все работало  smile а про FRAMESHARED_EXPORT в его книге ни слова. Первый раз такое встречаю )) хотя я нуб еще )) может провтыкал! 


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
borisbn
Дата 19.4.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



FRAMESHARED_EXPORT у тебя описан в frame_global.h
Код

#if defined(FRAME_LIBRARY)
#  define FRAMESHARED_EXPORT Q_DECL_EXPORT
#else
#  define FRAMESHARED_EXPORT Q_DECL_IMPORT
#endif

Q_DECL_EXPORT описан как __declspec( dllexport )

Цитата(loneybibi @  19.4.2011,  13:05 Найти цитируемый пост)
это вроде ж стандарт описания функций С по всем книжкам .. 

да, это - стандарт описания функций, но не объявления их как "экспортируемые из dll". Такого стандарта нет. Возможно линуксовский компилятор экспортирует все функции, объявленные как extern "C"... или же вообще все функции ? Не знаю.

Это сообщение отредактировал(а) borisbn - 19.4.2011, 13:20


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
loneybibi
Дата 19.4.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.5.2010
Где: Донецк (Украина)

Репутация: 3
Всего: 3



спасибо за объяснение! smile 


--------------------
Red Hat Fedora 17
Qt 4.8.1 (x64), GCC 4.4.3,
G++ 4.4.3, QtCreator 2.4.1
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0466 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.