Russian Qt Forum

Qt => Общие вопросы => Тема начата: break от Декабрь 23, 2007, 05:05



Название: создаю DLL на QT
Отправлено: break от Декабрь 23, 2007, 05:05
как правильно использовать макросы Q_EXTERN_C и Q_EXPORT, читал что они нужны чтобы заменить
extern "C" и __declspec(dllexport)

если без макросов писать все компилится если с ними, то нет. Как правильно?


Название: Re: создаю DLL на QT
Отправлено: ритт от Декабрь 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 не дефайнишь


Название: Re: создаю DLL на QT
Отправлено: Вячеслав от Декабрь 23, 2007, 12:18
А именно DLL нужна или может в сторону плагинов посмотреть ?


Название: Re: создаю DLL на QT
Отправлено: break от Декабрь 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;
};

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


Название: Re: создаю DLL на QT
Отправлено: pastor от Декабрь 24, 2007, 14:40
вроде работает, это хуже чем приведенный пример?

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


Название: Re: создаю DLL на QT
Отправлено: break от Декабрь 24, 2007, 15:16
Сейчас эта библиотека линкуется динамически с пом. QLibrary.
секция импорта для винды нужна только при статической линковке? или в обоих случаях.


Название: Re: создаю DLL на QT
Отправлено: vaprele07 от Декабрь 25, 2007, 10:51
в темплейте ставишь lib в конфиг dll для <QtGlobal> и, или plugin если хочешь чтобы работали макросы <QtPlugin> и static для получения статистического модуля. В 4.4 они еще кучу макросов по напридумывали посфорвардинг, возможно исправили глюк с неймспайцем вокруг Q_DECLARE_INTERFACE  ::)


Название: Re: создаю DLL на QT
Отправлено: vregess от Декабрь 25, 2007, 20:39
кстати подобная тема уже обсуждалась http://prog.org.ru/forum/index.php/topic,6209.0.html


Название: Re: создаю DLL на QT
Отправлено: Zmeishe от Декабрь 28, 2007, 15:43
Скопипастил решение сюда по просьбе xep (http://prog.org.ru/forum/index.php?action=profile;u=4679)

Для Винды нужно в каждой библиотеке сделать индивидуальный 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
}
НЕ ДОБАВЛЯТЬ