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

Я компилирую существующую библиотеку 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; могут быть необработанные статические инициализаторы или терминаторы

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

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


person Daniel Trebbien    schedule 23.09.2015    source источник
comment
Почему бы вам просто не использовать статическую инициализацию? (Поскольку вы уже знаете, что инициализатор модуля, предоставленный компилятором, подключается к этому)   -  person Ben Voigt    schedule 25.09.2015
comment
@BenVoigt: Вы имеете в виду предварительное вычисление InitLookupTables1() и InitLookupTables2() и установку значений глобальных переменных, влияющих на результаты?   -  person Daniel Trebbien    schedule 25.09.2015