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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: extern "C" и __declspec(dllexport)  (Прочитано 9562 раз)
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 позволяет кросс-компиляторно-платформенно этот вопрос решить?
Записан
Sergeich
Гость
« Ответ #1 : Август 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
Записан
QCasper
Гость
« Ответ #2 : Август 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?
Записан
Sergeich
Гость
« Ответ #3 : Август 04, 2006, 10:29 »

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

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


я что-то плохо улавливаю связь, с моим случаем. У меня не две разных платформы, а два разных компилятора. А платформа виндовzz.
Записан
Sergeich
Гость
« Ответ #5 : Август 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
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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