2011-05-14 45 views
3

我使用mingw 4.5.0編譯DLL,並將其用作Game Maker 8.0擴展。 Game Maker動態加載dll。一切似乎都起作用(dll函數被調用並提供正確的返回值),但是當我關閉Game Maker時,會彈出一個對話框:「Microsoft Visual C++運行時庫」,「該應用程序請求運行時以非常規方式終止。 「之後,該過程繼續在後臺停留幾秒鐘,然後消失。編譯時如果沒有-static,爲什麼編譯後的Game Maker擴展會在退出時崩潰?

這也發生在沒有任何函數的dll被實際調用時。沒有DllMain,所有靜態/全局變量都是基本數據類型或std::string(實際上,當我刪除std :: strings時也會發生這種情況)。

該DLL與zlib和libpng靜態鏈接。這個問題似乎消失了,當我通過靜態鏈接器(我認爲)靜態鏈接運行時。但是,這大大增加了我的DLL的大小,在我理解正在發生的事情之前,它至多是一種解決方法。

任何想法可能是什麼原因?

更新:事實上,問題似乎只發生在兩個擴展程序在Game Maker中加載時:一個dll與-static鏈接,另一個沒有。將兩者連接在一起,不會導致問題消失。但是,我仍然不明白這個問題,因爲dll永遠不會直接交互或共享數據結構。

更新2:我最近發現這可能與Game Maker本身的奇怪行爲有關。似乎全局變量在加載DLL時未正確初始化,如果全局對象嘗試釋放它們不擁有的內存,這可能會導致卸載崩潰。這意味着-static只是一個隨機因素,它改變了全局變量所關聯的未初始化內存的值。

更新3:修改了上面包含的信息,這是關於遊戲製作的擴展,因爲這是按照更新2

回答

0

這只是一個猜測有可能相關。試着研究一下類似於描述爲here的「靜態初始化順序失敗」。這可能是因爲你的問題與析構函數更相關(因爲它發生在最後)。