Раньше я сталкивался с подобной проблемой, хотя тогда я определил код регистрации в отдельном проекте LIB. Оказывается, компоновщик оптимизировал мои объекты! Мое решение состояло в том, чтобы ссылаться на эти «объекты регистрации» в функции. Затем я вызвал функцию из моего приложения. Может быть, что-то подобное происходит здесь? Попробуйте отключить оптимизацию всей программы и посмотрите, что произойдет. Возможно, вам придется что-то сделать, чтобы оптимизатор не воспринимал эти объекты как мертвый код. (Мне бы хотелось, чтобы в Visual C ++ были атрибуты для пометки кода как не мертвого ...)
Обновление:
Если не считать чистого способа пометить объекты как мертвые, мне пришлось прикоснуться к коду в обоих проектах. В проекте LIB я определил функции, а не глобальные объекты. В проекте приложения я определил функции, которые вызывали эти функции.
Что вы можете сделать, это:
// Registrations.cpp
#ifdef EXPORT_REGISTRATIONS
#define REGISTRATION_CODE(theClass) \
void register_##theClass##_function() { \
// Code for registering your class \
}
#else
#define REGISTRATION_CODE(theClass) \
// Declare a function prototype for the function in LIB \
void register_##theClass##_function(); \
struct theClass##importer { \
theClass##importer() { \
// Call into LIB \
register_##theClass##_function(); \
} \
} g_##theClass##importerInstance; \
#endif
REGISTRATION_CODE(MyClass);
REGISTRATION_CODE(MyOtherClass);
Затем в проекте LIB убедитесь, что определено EXPORT_REGISTRATIONS
. Это сгенерирует функции, которые выполняют фактическую регистрацию, которую вы собираетесь делать. В проекте приложения убедитесь, что EXPORT_REGISTRATIONS
не определено . #include "<path to lib project>\Registrations.cpp"
в проекте приложения. Это сгенерирует глобальные объекты (например, ваши оригинальные), которые вызывают функции, определенные в проекте LIB.
Так я решил свою проблему. Ваш пробег может варьироваться. :)