mingw 4.5.0でDLLをコンパイルし、GameMaker8.0拡張機能として使用します。GameMakerは動的にdllをロードします。すべてが機能しているように見えますが(dll関数が呼び出され、正しい戻り値を提供します)、Game Makerを閉じると、「Microsoft Visual C ++ランタイムライブラリ」、「このアプリケーションはランタイムに異常な方法で終了するように要求しました。 「」その後、プロセスはバックグラウンドで数秒間残り、その後消えます。
これは、dllの関数が実際に呼び出されていない場合にも発生します。はなくDllMain
、すべての静的/グローバル変数は基本的なデータ型またはですstd::string
(実際には、std :: stringsを削除したときにも発生します)。
dllはzlibおよびlibpngと静的にリンクします。ランタイムを静的にリンクするリンカーに-staticを渡すと、問題は解消されるようです。ただし、これによりDLLのサイズが大幅に大きくなり、何が起こっているのかを理解するまでは、せいぜい回避策になります。
原因は何かについてのアイデアはありますか?
更新:実際、問題は2つのエクステンソンがGame Makerにロードされた場合にのみ発生するようです。1つは-staticにリンクされたdllを使用し、もう1つは使用しません。-staticを使用せずに両方をリンクすると、問題が解消されます。ただし、dllが直接相互作用したり、データ構造を共有したりすることはないため、私はまだ問題を理解していません。
アップデート2:最近、これがGameMaker自体の奇妙な動作に関連している可能性があることを発見しました。DLLのロード時にグローバル変数が正しく初期化されていないようです。これにより、グローバルオブジェクトが所有していないメモリを解放しようとすると、アンロード時にクラッシュが発生する可能性があります。つまり、-staticは、グローバルが関連付けられている初期化されていないメモリの値を変更する単なるランダムな要因でした。
アップデート3:アップデート2のように関連している可能性が高いため、これがゲームメーカーの拡張機能に関する情報を含むように上記を変更しました。