Есть ли способ настроить инициализатор модуля по умолчанию?

Я компилирую существующую библиотеку C++ как C++/CLI DLL. Библиотека C++ имеет две подпрограммы инициализации, которые необходимо вызывать для настройки различных таблиц поиска.

Изначально использовалась библиотека C++ std::once_flag а также std::call_once() из , чтобы выполнить однократную инициализацию таблиц поиска. Однако в C++ / CLI заголовок не поддерживается:
Ошибка не поддерживается при компиляции с / clr или / clr: pure

Затем я попытался с помощью std::atomic_flag из , но заголовок также не поддерживается в C++ / CLI.

После просмотра Где я могу инициализировать управляемую C++/CLI DLL? Затем я попытался реализовать DllMain(), но столкнулся с проблемой, что процедуры инициализации библиотеки C++ необходимы для вызова управляемого кода. В моем случае я не могу скомпилировать процедуры инициализации как неуправляемый код (используя #pragma unmanaged).

Затем я опробовал инициализатор модуля:

#pragma warning( disable : 4483 )
void __clrcall __identifier(".cctor")()
{
    InitLookupTables1();
    InitLookupTables2();
}

Однако это вызывает 33 предупреждения компоновщика формы:

1> some.obj: предупреждение LNK4210: секция.CRTMP существует; могут быть необработанные статические инициализаторы или терминаторы

Я предполагаю, что мой пользовательский инициализатор модуля переопределяет сгенерированный компилятором инициализатор модуля, который правильно выполняет всю статическую инициализацию, такую ​​как установка начальных значений глобальных переменных.

Есть ли способ настроить сгенерированный компилятором инициализатор модуля или иным образом организовать вызов процедур инициализации библиотеки сгенерированным компилятором инициализатором модуля?

0 ответов

Другие вопросы по тегам