У меня есть система регистрации типов для настраиваемой формы информации о типах во время выполнения.До сих пор я использовал следующий макрос для вызова функции регистрации перед main и регистрации типов:
#define REGISTRATION \
static void _register(); \
namespace { struct temp { temp() { _register(); } }; } \
static const temp CAT(temp, __LINE__); \
static void _register()
Таким образом, я могу сделать это во множестве различных файлов cpp:
REGISTRATION()
{
RegisterNewType(vec2)
->RegisterMember("x", &vec2::x)
->RegisterMember("y", &vec2::y);
}
Это прекрасно работает.Однако это разваливается, когда я пытаюсь сделать это в статической библиотеке.Похоже, что это потому, что C ++ не инициализирует статические переменные в статических библиотеках.
Я решил поискать решение и нашел следующее:
#define REGISTRATION \
static void _register() __attribute__((constructor)); \
static void _register()
Это может решить мою проблему, но оказывается, что я могу сделать это только в clang и gcc.Я использую MSVC.
Есть ли способ заставить это работать, чтобы я мог иметь предварительные функции в библиотеках?
РЕДАКТИРОВАТЬ: Еще несколько поисков привели меня к этому:
#if defined(_MSC_VER)
#pragma section(".CRT$XCU",read)
#define EXT_REGISTRATION_(f,p) \
static void __cdecl f(void); \
__declspec(allocate(".CRT$XCU")) void (__cdecl*f##_)(void) = f; \
__pragma(comment(linker,"/include:" p #f "_")) \
static void __cdecl f(void)
#ifdef _WIN64
#define EXT_REGISTRATION(f) EXT_REGISTRATION_(f,"")
#else
#define EXT_REGISTRATION(f) EXT_REGISTRATION_(f,"_")
#endif
#else
#define EXT_REGISTRATION(f) \
static void f(void) __attribute__((constructor)); \
static void f(void)
#endif
Однако функция регистрации по-прежнему не вызывается.Отладчик утверждает, что No symbols have been loaded
.