dll - 为什么 mingw 编译的 Game Maker 扩展在没有 -static 的情况下编译时会在退出时崩溃?

标签 dll mingw game-maker

我用 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 相关。

最佳答案

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

关于dll - 为什么 mingw 编译的 Game Maker 扩展在没有 -static 的情况下编译时会在退出时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001176/

相关文章:

c# - 如何将第三方 dll 与自己的 dll 结合

c++ - 在 CMake 项目中传递复制 dll

c# - 另一个项目限制中引用的项目

c++ - ld工具可以找到该库,但是mingw无法找到(linux)

c++ - 读取windows文件; _stat 返回不正确的值

c++ - 制作一个包装器 dll 让 gamemaker 处理 C++ 标准库

sprite - GML Sprite 方向面临问题?

c++ - 覆盖dll中的fastfail以防止整个应用程序在STACK_BUFFER_OVERRUN上崩溃(0xc0000409)

c++ - 带有 MinGW GCC 的 Eclipse CDT 出现错误 127

rotation - 在枪管中产生子弹