gpt4 book ai didi

c++ - 加载 DLL 不初始化静态 C++ 类

转载 作者:可可西里 更新时间:2023-11-01 18:11:39 30 4
gpt4 key购买 nike

我有一个在运行时加载的 DLL。 DLL 依赖于内部工作的静态变量(它是一个 std::map),这个变量在 DLL 中定义。

当我在加载后调用 DLL 中的第一个函数时,我从 DLL 中得到一个 SegFault, map 从未被初始化。从我从 DLL 加载中读到的所有内容来看,静态和全局数据初始化甚至应该在调用 DLLMain 之前发生。

为了测试静态初始化,我添加了一个打印出一条消息的静态结构,甚至还设置了一个断点以备不时之需。

static struct a
{
a(void) { puts("Constructing\n"); }
}statica;

在调用 DLLMain 或函数之前没有消息或中断。

这是我的加载代码:

  dll = LoadLibrary("NetSim");
//Error Handling

ChangeReliability = reinterpret_cast<NetSim::ChangeReliability>
(GetProcAddress(dll, "ChangeReliability"));


ChangeReliability(100);

我已经验证了dll版本是正确的,多次重建整个项目,但没有区别。我没有想法。

最佳答案

链接 DLL 时,是否指定了/ENTRY 开关?如果是这样,它将覆盖链接器的默认值,即 DllMainCRTStartup。因此,不会调用 _CRT_INIT,进而不会调用全局初始化程序,这将导致未初始化的全局(静态)数据。

如果您为自己的入口点指定/ENTRY,则需要在进程附加和进程分离期间调用 _CRT_INIT。

如果您没有指定/ENTRY,链接器应该使用 CRT 的入口点,该入口点在调用您的 DllMain 之前在进程附加/分离上调用 _CRT_INIT。

关于c++ - 加载 DLL 不初始化静态 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5114683/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com