Может ли C ++ экспортировать класс из DLL - PullRequest
9 голосов
/ 16 января 2010

Я хотел бы знать, является ли экспорт class (__declspec (dllexport) в VC ++) своего рода стандартом (ANSI, ISO, ...)
Я хотел бы знать, если кто-то уже пытался сделать то же самое с Intel C ++ компилятор и GCC (MINGW на Windows) и если можно смешивать DLL, сгенерированные из разных компиляторов (я действительно сомневаюсь, что это возможно)

Thx

Ответы [ 4 ]

9 голосов
/ 16 января 2010

Нет, __ declspec зависит от VC ++.

Одной из причин, по которой VC ++ необходим, является то, что по умолчанию библиотеки DLL не предоставляют символы вне библиотеки DLL, если это явно не требуется. В Posix общие объекты предоставляют все свои (не статичные) символы, если явно не указано, чтобы скрыть их.

Обновление

Исходя из вашего комментария, что вы хотите сделать ваш код переносимым, вы хотите использовать препроцессор и сделать что-то вроде этого:

#ifdef WIN32
  #ifdef EXPORT_CLASS_FOO
    #define CLASS_FOO __declspec(dllexport)
  #else
    #define CLASS_FOO __declspec(dllimport) 
  #endif
#else
  #define CLASS_FOO
#endif

class CLASS_FOO foo
{ ... };

В проекте, реализующем класс, обязательно добавьте EXPORT_CLASS_FOO в качестве определения препроцессора (находится в Project | NAME Properties .. в C / C ++ | Preprocessor | Preprocess Definitions). Таким образом, вы будете экспортировать их при сборке DLL, импортировать их при использовании DLL и ничего не делать под Unix.

4 голосов
/ 30 августа 2012

Теперь можно экспортировать только определенные символы [Классы / API] из DLL [в Windows] или SO [on * nix], используя стек компилятора / компоновщика GCC. Достаточно хороший обзор того, как это сделать, см. http://gcc.gnu.org/wiki/Visibility.

2 голосов
/ 16 января 2010

Понятие DLL очень зависит от платформы. На него не распространяется ни один даже универсально применимый стандарт. На самом деле, сама DLL-аббревиатура обычно зарезервирована для динамических библиотек Windows. Нет необходимости добавлять что-либо специфическое для поддержки DLL в C / C ++, очень зависит от платформы / поставщика.

2 голосов
/ 16 января 2010

Все, что начинается с __ в C ++, является расширением для конкретного поставщика. Я не знаю, поддерживают ли это другие производители компиляторов, но это, безусловно, несовместимый кросс-компилятор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...