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