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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: создаю DLL на QT  (Прочитано 7129 раз)
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« : Декабрь 23, 2007, 05:05 »

как правильно использовать макросы Q_EXTERN_C и Q_EXPORT, читал что они нужны чтобы заменить
extern "C" и __declspec(dllexport)

если без макросов писать все компилится если с ними, то нет. Как правильно?
Записан
ритт
Гость
« Ответ #1 : Декабрь 23, 2007, 05:10 »

#include <QtGlobal>

#define
#ifdef Q_OS_WIN
#   ifdef CORELIB_BUILD
#      define CORE_EXPORT Q_DECL_EXPORT
#   else
#      define CORE_EXPORT Q_DECL_IMPORT
#   endif
#endif
#ifndef CORE_EXPORT
#   define CORE_EXPORT
#endif


соответственно, при сборке дллки дефайнишь CORELIB_BUILD, а при сборке другого бинаря, использующего данную длл, CORELIB_BUILD не дефайнишь
Записан
Вячеслав
Гость
« Ответ #2 : Декабрь 23, 2007, 12:18 »

А именно DLL нужна или может в сторону плагинов посмотреть ?
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #3 : Декабрь 24, 2007, 13:16 »

сейчас сделал так:

в DLL.H
Код:
#include <qglobal.h>

#ifdef Q_WS_WIN
#define EXPORT_TYPE __declspec(dllexport)
#else
#define EXPORT_TYPE
#endif

extern "C" EXPORT_TYPE int dllTest();

в DLL.CPP
Цитировать
#include <test_dll.h>
#include <QDebug>

int dllTest()
{
   qDebug("100");
   return 100;
};

вроде работает, это хуже чем приведенный пример?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Декабрь 24, 2007, 14:40 »

вроде работает, это хуже чем приведенный пример?

да хуже, правильные его вариант привел xep. Нет секции импорта для винды
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #5 : Декабрь 24, 2007, 15:16 »

Сейчас эта библиотека линкуется динамически с пом. QLibrary.
секция импорта для винды нужна только при статической линковке? или в обоих случаях.
Записан
vaprele07
Гость
« Ответ #6 : Декабрь 25, 2007, 10:51 »

в темплейте ставишь lib в конфиг dll для <QtGlobal> и, или plugin если хочешь чтобы работали макросы <QtPlugin> и static для получения статистического модуля. В 4.4 они еще кучу макросов по напридумывали посфорвардинг, возможно исправили глюк с неймспайцем вокруг Q_DECLARE_INTERFACE  Строит глазки
Записан
vregess
Гость
« Ответ #7 : Декабрь 25, 2007, 20:39 »

кстати подобная тема уже обсуждалась http://prog.org.ru/forum/index.php/topic,6209.0.html
Записан
Zmeishe
Гость
« Ответ #8 : Декабрь 28, 2007, 15:43 »

Скопипастил решение сюда по просьбе xep

Для Винды нужно в каждой библиотеке сделать индивидуальный H-файл и объявить в нём директиву экспорта.
Только одна библиотека и только одна директива. Т.е. нельзя директиву экспорта из одной библиотеки заюзывать в другую. Особенно если другая использует первую.
Если посмотреть исходники Qt
class Q_CORE_EXPORT QString ... для QtCore4.dll
class Q_NETWORK_EXPORT QFtp ... для QtNetwork4.dll
Разным модулям - разные директивы экспорта. 

Для программистов Windows это и так должно быть понятно. Для тех кто портирует библиотеки с Линукса в Винду это НЕ сразу понятно. Например, я не сразу сообразил, т.к. Линуксу до "лампады" эти директивы.
 
/*mylibname.h Короткий H-файл для всех исходных модулей библиотеки*/
#ifndef __MYLIBNAME_H__
#define __MYLIBNAME_H__

#ifdef Q_OS_WIN
#   if defined( QT_BUILD_MYLIBNAME_LIB )
#      define Q_MYLIBNAME_EXPORT __declspec(dllexport)
#   else
#      define Q_MYLIBNAME_EXPORT __declspec(dllimport)
#   endif
#else
#      define Q_MYLIBNAME_EXPORT
#endif

#endif // __MYLIBNAME_H__

/*Классы для библиотеки объявлять так*/
#include "mylibname.h"

class Q_MYLIBNAME_EXPORT MyClass {...};

/*В файл проекта библиотеки добавить */
win32 {
 DEFINES +=  QT_BUILD_MYLIBNAME_LIB
}

/*В файл проекта программы, использующей эту библиотеку */
win32 {
 DEFINES +=  QT_BUILD_MYLIBNAME_LIB
}
НЕ ДОБАВЛЯТЬ
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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