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

时间:2011-05-14 10:18:56

标签: 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中加载两个扩展时:一个dll与-static链接,另一个没有。没有-static链接两者会使问题消失。但是,我仍然不明白这个问题,因为dll永远不会直接交互或共享数据结构。

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

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

1 个答案:

答案 0 :(得分:0)

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