3

我用 mingw 4.5.0 编译了一个 DLL 并将其用作 Game Maker 8.0 扩展。Game Maker 动态加载 dll。一切似乎都可以正常工作(调用 dll 函数并提供正确的返回值),但是当我关闭 Game Maker 时会弹出一个对话框:“Microsoft Visual C++ 运行时库”,“此应用程序已请求运行时以不寻常的方式终止。 " 之后,该过程继续在后台徘徊几秒钟,然后消失。

当没有实际调用 dll 的任何函数时,也会发生这种情况。没有DllMain,并且所有静态/全局变量都是基本数据类型或std::string(当我删除 std::strings 时也会发生这种情况)。

dll 与 zlib 和 libpng 静态链接。当我将 -static 传递给链接器(我假设)也静态链接运行时时,问题似乎消失了。但是,这大大增加了我的 DLL 的大小,在我了解发生了什么之前,它充其量只是一种解决方法。

关于可能是什么原因的任何想法?

更新:实际上,似乎只有在 Game Maker 中加载了两个扩展时才会出现问题:一个带有与 -static 链接的 dll,而另一个没有。在没有 -static 的情况下链接两者会使问题消失。但是,我仍然不明白这个问题,因为 dll 从不直接交互或共享数据结构。

更新 2:我最近发现这可能与 Game Maker 本身的奇怪行为有关。加载 DLL 时似乎没有正确初始化全局变量,如果全局对象试图释放它们不拥有的内存,这可能会导致卸载时崩溃。这意味着 -static 只是一个随机因素,它改变了与全局变量关联的未初始化内存的值。

更新 3:修改了上述内容以包含有关 Game Maker 扩展的信息,因为这可能与更新 2 相关。

4

1 回答 1

0

这只是一个猜测。尝试查看此处描述的“静态初始化顺序失败”之类的内容。可能您的问题与析构函数更相关(因为它发生在关闭时)。

于 2012-01-28T20:16:21.293 回答