2013-12-16 8 views
9

3台のコンピュータがあり、そのうちの2台がWindows 8を使用しています。MinGWのg ++​​(4.8.1-4)の最新バージョンを使用すると、hello worldプログラムはコンパイルして実行するたびにフリーズしますWindows 7のstd :: endl MinGWを使用してコンパイルされたWindows8をクラッシュします

#include <iostream> 
int main() 
{ 
    std::cout << "Hello, World!" <<std::endl; 
    return 0; 
} 

Windows 8のコンピュータ上ではなく、中にこれはグラムでうまくコンパイル++が、A.EXEを実行すると表示されます「こんにちは、世界!」ウィンドウがポップアップして「a.exeが機能しなくなった、Windowsがプログラムの解決策をオンラインで確認できる...」などと表示されます。

誰でもこの問題を見たことがありますか?

また、 "std :: cout < <"こんにちは、世界!\ n "< < std :: flush;"これにも同じ問題があります。バッファをフラッシュするすべての関数がクラッシュを引き起こすようです。エリックの助言に従い

、私はプログラムを再コンパイルし、gdbの中でそれを実行し、次の出力ました:

Program received signal SIGILL, Illegal instruction. 
0x00405065 in _Jv_RegisterClasses() 
+7

デバッガで実行してみます。それは少なくとも失敗がどこにあるか教えてくれるでしょう。 –

+0

OK、gdbを実行しました。プログラム受信シグナルSIGILL、不正な命令、_Jv_RegisterClasses()で0x00405065と表示されました – user1276560

+2

おそらく、標準のC++ライブラリが互換性のないバージョンのランタイムでコンパイルされていると思います最も基本的なライブラリのようなものです。 –

答えて

6

番目のインスタンスでは、「\ nは」ものの、いずれの場合の出力のフラッシュを起こす必要がありますWindowsでは、明示的にフラッシュすることなく、コンソールの出力が即時(またはおそらくは短時間のタイムアウト後に自動)になると考えています。

は、私は以下のような実験を提案:

1)それは)MinGWのMicrosoftのCランタイムでのCライブラリを(使用してC++ライブラリに固有のものではglibcのではなく、使用されているかどうかを確認してください:

#include <stdio.h> 
int main() 
{ 
    printf("Hello, World!\n") ; 
    return 0; 
} 

2)によって終了コードを排除:

int main() 
{ 
    return 0; 
} 

3)全く改行:

#include <iostream> 
int main() 
{ 
    std::cout << "Hello, World! ; 
    return 0; 
} 

4)このような最適化レベルなど、さまざまなコンパイラオプションを試してみてください、または、例えば​​、またはhere示唆したように:-static-libgcc -static-libstdc++(私はMinGWのは、MicrosoftのCランタイムDLLを使用していますので、 `` -static-libgcc`自体は何の影響も及ぼさないだろうが、と静的ライブラリはMicrosoftのツールでのみ利用可能です)。

+2

これはうまくいきました。あなたは正しかった:-static-libgccフラグは助けにならなかった。 -static-libstdC++フラグのみが問題を解決できました。 また、-fno-builtinはそれを修正しませんでした。私はかなり経験豊富なPythonプログラマーですが、明らかに私はちょうどC++を学んでいます。このコンパイラフラグが私の問題を解決するために何をしたのかを推測してもらえますか? – user1276560

+2

@ user1276560: '-static-libstdC++ 'がないと、標準的なC++ライブラリは、静的にリンクされたライブラリではなく、Dynamic Link Library *によって提供されます。おそらく、そのライブラリのMinGWビルドにはいくつかの非互換性があり、スタティックライブラリビルドには存在しません。その結果、実行可能ファイルは少し大きくなりますが、プラス側では、DLLがそれと共に配布されることを保証する必要はなく、再配布可能になります。 – Clifford

+0

私の場合、 'char * str'のようなポインタを使用してユーザから文字列を取得すると、配列のサイズが固定されていればクラッシュの問題が発生します。あなたはそれを私に助けてくれますか? – viveksinghggits

0

私は同じ問題を抱えていました。長い苦痛を伴う検索の結果、mingwの複数のバージョンでlibstdC++ - 6.dllが提供されたことがわかりました。 1つは、他のインストールパッケージ(gnuplotとGIMP)の一部であったインストールの一部でした。私のPATHにgnuplotを持っていたので、コンパイルされたmingw exeは、このdllの互換性のない古いバージョンを使用し、記述された症状でクラッシュします。したがって、私はDietmarKühlの疑惑を確認することができます。上記のようにライブラリを静的にリンクすると、ライブラリ関数がコンパイル時にexeにインクルードされるので、この場合は明らかに役立ちます。

+0

これは答えではありません。質問は3年前に答えられました。なぜあなたは問題を解決していないと答えたのですか? –