Главная > C++, DLL, Синтаксис C++, программирование > Волшебное заклинание для экспорта DLL

Волшебное заклинание для экспорта DLL

Я нашел волшебное заклинание для упрощения импорта-экспорта шаблонов, функций и классов из DLL. Делюсь.

В общем для библиотеки заголовочном файле напишите такие дефайны:

#ifdef WIN32
# if defined(BUILD_LIBNAME_DLL) && defined(BUILD_LIBNAME_STATIC)
# error You must define only one of the build macross
# endif
# if defined(USE_LIBNAME_DLL) && defined(USE_LIBNAME_STATIC)
# error You must define only one of the build macross
# endif
# ifdef BUILD_LIBNAME_DLL // Create a DLL library
# define LIBNAME_STATIC_MEMBER static
# define LIBNAME_DLL_EXPORT __declspec(dllexport)
# define LIBNAME_DLL_TEMPLATE
# elif defined USE_TGSCORE_DLL // Use a DLL library
# define LIBNAME_STATIC_MEMBER static __declspec(dllimport)
# define LIBNAME_DLL_EXPORT __declspec(dllimport)
# define LIBNAME_DLL_TEMPLATE extern
# endif
# if defined(BUILD_LIBNAME_STATIC) || defined(USE_LIBNAME_STATIC)
# define LIBNAME_STATIC_MEMBER static
# define LIBNAME_DLL_EXPORT
# define LIBNAME_DLL_TEMPLATE
# endif
# if !defined(BUILD_LIBNAME_DLL) && !defined(USE_LIBNAME_DLL) && !defined(BUILD_LIBNAME_STATIC) && !defined(USE_LIBNAME_STATIC)
# error You must define USE_LIBNAME_? or BUILD_LIBNAME_? (see LIBNAMECommon.h)
# endif
#else
# define LIBNAME_STATIC_MEMBER static
# define LIBNAME_DLL_EXPORT
# define LIBNAME_DLL_TEMPLATE
#endif /* WIN32 */

в заголовочнике для экспортируемых классов используйте:

class LIBNAME_DLL_EXPORT ClassName {
};
для экспорта класса.

class ClassName {
LIBNAME_STATIC_MEMBER Name;
};
для экспорта статического члена класса.

LIBNAME_DLL_TEMPLATE template class LIBNAME_DLL_EXPORT std::vector;
для экспорта специализации шаблона.
на этом месте компилер выдаст ошибку при импорте, микрософт говорит что ее можно игнорировать (http://support.microsoft.com/default.aspx?scid=KB;EN-US;168958).

в зависимости от того исполььзуете вы библиотеку или собираете, и dll или статическую, определите один из макросов: BUILD_LIBNAME_DLL, BUILD_LIBNAME_STATIC, USE_LIBNAME_DLL, USE_LIBNAME_STATIC

Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Follow

Get every new post delivered to your Inbox.