2010-01-16 3 views
9

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

Thx

+0

Идея вопроса состоит в том, чтобы иметь возможность компилировать код в разных системах (win, linux, * bsd), но разрабатывать на окнах (мне нравится визуальная студия и инструменты, которые она предоставляет (еще больше в следующей версии со всеми доступный параллельный инструмент !!)) и быстро скомпилировать его с окнами с mingw и msvc, чтобы проверить, что код «выглядит» нормально. Это сделает порт для Linux быстрее и проще – user246456

ответ

9

Нет, __declspec является специфическим для VC++.

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

Update

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

#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 | Определения предварительной обработки). Таким образом, вы будете экспортировать их при создании DLL, импортировать их, когда используете DLL, и не делаете ничего особенного в Unix.

+0

означает ли это, что мы можем экспортировать класс и повторно использовать его сразу? Является ли он специфичным для системы (POSIX) или компилятором (делает ли Intel C++ на linux одинаковое поведение) – user246456

+0

Это зависит от флагов компилятора на Intel C++ или gcc, но по умолчанию используется для отображения символов. Просто сделайте несколько макросов препроцессора, чтобы вы могли условно скомпилировать этот вид экспорта. –

+0

R Samuel Как мы спрячем класс в posix-общих объектах? –

2

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

+0

+1, хотя я верю, что MinGW поддерживает это конкретное расширение Microsoft, чтобы упростить код переноса. В отличие от VC++, MinGW не нуждается в этом. –

2

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

+1

На самом деле OS2 также использовали DLL. Но это был общий код между MS и IBM за один раз ... :-) –

4

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

Смежные вопросы