Есть ли способ настроить инициализатор модуля по умолчанию?
Я компилирую существующую библиотеку C++ как C++/CLI DLL. Библиотека C++ имеет две подпрограммы инициализации, которые необходимо вызывать для настройки различных таблиц поиска.
Изначально использовалась библиотека C++ std::once_flag
а также std::call_once()
из
Ошибка
Затем я попытался с помощью std::atomic_flag
из
После просмотра Где я могу инициализировать управляемую C++/CLI DLL? Затем я попытался реализовать DllMain(), но столкнулся с проблемой, что процедуры инициализации библиотеки C++ необходимы для вызова управляемого кода. В моем случае я не могу скомпилировать процедуры инициализации как неуправляемый код (используя #pragma unmanaged
).
Затем я опробовал инициализатор модуля:
#pragma warning( disable : 4483 )
void __clrcall __identifier(".cctor")()
{
InitLookupTables1();
InitLookupTables2();
}
Однако это вызывает 33 предупреждения компоновщика формы:
1> some.obj: предупреждение LNK4210: секция.CRTMP существует; могут быть необработанные статические инициализаторы или терминаторы
Я предполагаю, что мой пользовательский инициализатор модуля переопределяет сгенерированный компилятором инициализатор модуля, который правильно выполняет всю статическую инициализацию, такую как установка начальных значений глобальных переменных.
Есть ли способ настроить сгенерированный компилятором инициализатор модуля или иным образом организовать вызов процедур инициализации библиотеки сгенерированным компилятором инициализатором модуля?