Волшебное заклинание для экспорта 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