読者です 読者をやめる 読者になる 読者になる

のどあめ

ググってもなかなか出てこなかった情報を垂れ流すブログ。

MinGWのg++でコンパイルしたstd::coutを含むプログラムが強制終了する問題について

MinGW + gVim + QuickRunでテストプログラムを動かす環境を整えてみたら、
何故かMinGWコンパイルした一部のプログラムが強制終了することに気づきました。

#include <iostream>
int main(){
   std::cout << "a" << std::endl;
   return 0;
}

これが強制終了します(コンパイルは通る)。
他のPCのMinGWだとうまくいくのに・・・

今回は、この問題を解決する方法を見つけたので紹介します。


解決法1 : 静的ライブラリでコンパイル

>g++ test.cpp -static-libstd
>a.exe

これで動きました。

これは、つまりdllがおかしいということですね。

どうやら、STL関連のDLLはlibstdc++-6.dllとlibgcc_s_sjlj-1.dllの2つのようです。

ちゃんとパスが通っているか、再インストールしてみたらどうか、
色々と試してみましたが、問題は解決しませんでした。

しかし、ふと「libstdc++-6.dll」でファイル検索してみたところ、
なんとMinGWとは別のlibstdc++-6.dllが存在することを発見しました!!


解決法2 : dllの競合をなくす

どうやら、過去に入れた「Octave 3.6.4 for Windows MinGW」があるのに気が付かずに、
新たに最新版のMinGWを入れたのが問題だったようです。
Octave同封のlibstdc++-6.dllの方が先にパスを通していたので、
実行時にOctave側のdllを読みに行って落ちていたようです。

試しに、Octaveのパスを消してみると無事プログラムを動かすことが出来ました。
そして、今は特にOctaveを使う用事もないので、アンインストールすることで事なきを得ました。
(何の解決にもなってない)

Octaveを使う人は、VisualStudio版を使うか、MinGWのバージョンを合わせるか、
どちらかのパスを通さないかすればいいのではないでしょうか。


今回は結構うっかりな問題でしたが、
dllのバージョンが違う場合は強制終了せずに警告を出すぐらいしてくれても・・・