我正在将现有的C ++库编译为C ++ / CLI DLL。 C ++库有两个初始化例程,需要调用它们来设置各种查找表。
C ++库最初使用来自< mutex>的std::once_flag
和std::call_once()
执行查找表的一次性初始化。但是,在C ++ / CLI中,< mutex>标题不受支持:
Error <mutex> is not supported when compiling with /clr or /clr:pure
然后我尝试使用&lt; atomic&gt;中的std::atomic_flag
,但是&lt; atomic&gt;在C ++ / CLI中也不支持header。
在看到Where do I initialize a managed C++/CLI DLL?后,我尝试实现DllMain(),但我遇到了C ++库的初始化例程调用托管代码所需的问题。就我而言,我无法将初始化例程编译为非托管代码(使用#pragma unmanaged
)。
然后我尝试了一个模块初始化器:
#pragma warning( disable : 4483 )
void __clrcall __identifier(".cctor")()
{
InitLookupTables1();
InitLookupTables2();
}
但是,这会导致33个链接器警告形式:
1&gt; some.obj:警告LNK4210:.CRTMP部分存在;可能存在未处理的静态初始化器或终结器
我认为我的自定义模块初始化程序正在覆盖编译器生成的模块初始化程序,该模块初始化程序正确运行所有静态初始化,例如设置全局变量&#39;初始值。
有没有办法自定义编译器生成的模块初始化程序,或者安排让编译器生成的模块初始化程序调用库初始化例程?