Russian Qt Forum

Qt => Общие вопросы => Тема начата: QCasper от Август 03, 2006, 13:22



Название: extern "C" и __declspec(dllexport)
Отправлено: QCasper от Август 03, 2006, 13:22
Вопрос наверное не совсем в тему, но какой-то своей частью он касается Qt :)

Вобщем пишу я дллку, из которой мне надо экспортить UDT то есть user defined type. Конкретно в моем случае это QIcon.

1. Компиляция с помощью msvc.

пытаюсь экспортировать ф-цию таким образом:

Код:
extern "C" QIcon CSISPluginIcon() {
return QIcon(c_DirectDB_plugin_icon);
}


msvc мне намекает, что с помощью extern "C" не нужно экспортить UDT.
тогда я переписываю таким образом:

Код:
CSIS_EXPORT QIcon CSISPluginIcon() {
return QIcon(c_DirectDB_plugin_icon);
}


где CSIS_EXPORT объявлен в заголовке:

Код:
#ifdef CSIS_PLUGIN
#define CSIS_EXPORT __declspec(dllexport)
#else
#define CSIS_EXPORT __declspec(dllimport)
#endif


все отлично компилится, и что самое интересное - работает.

2. Компиляция с помощью гцц.

gcc говорит, что типа символ CSISPluginIcon не найден, поэтому экспортировать его скорее всего не удатся, и библиотеку не собирает.
Я переделываю все обратно, т.е. к виду с extern "C", и тогда все нормально компилится, и опять же, что самое интересное - работает.

Мне конечно не в лом при переходе от компилера к компилеру переписывать все это дело в 5ти файлах, но это не по джедайски. Собсно вопрос, как правильно делать? Может Qt позволяет кросс-компиляторно-платформенно этот вопрос решить?


Название: extern "C" и __declspec(dllexport)
Отправлено: Sergeich от Август 04, 2006, 00:03
Код:
#ifdef Q_WS_WIN
  #ifdef CSIS_PLUGIN
    #define CSIS_EXPORT __declspec(dllexport)
  #else
    #define CSIS_EXPORT __declspec(dllimport)
  #endif
#else
  #define CSIS_EXPORT
#endif


Название: extern "C" и __declspec(dllexport)
Отправлено: QCasper от Август 04, 2006, 09:25
Цитата: "Sergeich"
Код:
#ifdef Q_WS_WIN
  #ifdef CSIS_PLUGIN
    #define CSIS_EXPORT __declspec(dllexport)
  #else
    #define CSIS_EXPORT __declspec(dllimport)
  #endif
#else
  #define CSIS_EXPORT
#endif


а что такое Q_WS_WIN?


Название: extern "C" и __declspec(dllexport)
Отправлено: Sergeich от Август 04, 2006, 10:29
Для каждой из платформ, Qt определяет один из следующих символов: Q_WS_WIN, Q_WS_X11, Q_WS_MAC или Q_WS_QWS. Перед обращением к любому из них, исходный код приложения должен подключить хотя бы один заголовочный файл библиотеки.
("Разработка графического интерфейса с помощью библиотеки Qt3" Jasmin Blanchette, Mark Summerfield")


Название: extern "C" и __declspec(dllexport)
Отправлено: QCasper от Август 04, 2006, 11:20
Цитата: "Sergeich"
Для каждой из платформ, Qt определяет один из следующих символов: Q_WS_WIN, Q_WS_X11, Q_WS_MAC или Q_WS_QWS. Перед обращением к любому из них, исходный код приложения должен подключить хотя бы один заголовочный файл библиотеки.
("Разработка графического интерфейса с помощью библиотеки Qt3" Jasmin Blanchette, Mark Summerfield")


я что-то плохо улавливаю связь, с моим случаем. У меня не две разных платформы, а два разных компилятора. А платформа виндовzz.


Название: extern "C" и __declspec(dllexport)
Отправлено: Sergeich от Август 04, 2006, 13:36
Тады добавь еще
Код:
#ifdef Q_WS_WIN 
  #ifdef CSIS_PLUGIN
    #define CSIS_EXPORT __declspec(dllexport)
  #else
    #define CSIS_EXPORT __declspec(dllimport)
  #endif
  #ifdef Q_CC_GNU  
    #define CSIS_EXPORT
  #endif
#else
  #define CSIS_EXPORT
#endif