【问题标题】:Why does a mingw-compiled Game Maker extension crash on exit when compiled without -static?为什么在没有 -static 的情况下编译时,mingw 编译的 Game Maker 扩展在退出时会崩溃?
【发布时间】:2011-08-25 11:06:45
【问题描述】:

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

【问题讨论】:

    标签: dll mingw game-maker


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 2020-03-25
      相关资源
      最近更新 更多