0

我正在将现有的 C++ 库编译为 C++/CLI DLL。C++ 库有两个初始化例程,需要调用它们来设置各种查找表。

C++ 库最初使用<mutex>std::once_flagstd::call_once()执行查找表的一次性初始化。但是,在 C++/CLI 中,不支持 <mutex> 标头:
使用 /clr 或 /clr:pure 编译时不支持错误 <mutex>

然后我尝试使用std::atomic_flag<atomic>,但 C++/CLI 也不支持 <atomic> 标头。

看到我在哪里初始化托管 C++/CLI DLL 之后?然后我尝试实现 DllMain(),但遇到了 C++ 库的初始化例程需要调用托管代码的问题。就我而言,我无法将初始化例程编译为非托管代码(使用#pragma unmanaged)。

然后我尝试了一个模块初始化程序:

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

但是,这会导致以下形式的 33 个链接器警告:

1>some.obj : 警告 LNK4210: .CRTMP 部分存在;可能有未处理的静态初始化器或终止器

我想我的自定义模块初始化程序正在覆盖编译器生成的模块初始化程序,它可以正确运行所有静态初始化,例如设置全局变量的初始值。

有没有办法自定义编译器生成的模块初始化器或以其他方式安排编译器生成的模块初始化器调用库初始化例程?

4

0 回答 0