2012-08-15 10 views
11

私はMinGW GCCバージョン4.4以降を使用していて、アップグレードすることに決めました。私はMinGWのウェブサイトに行き、最新バージョンのGCC(4.7.0)をダウンロードしました。簡単なプログラムのクラッシュ

私の前のバージョンを削除して最新のバージョンをインストールした後、最も単純なプログラムでもクラッシュします。例えば、私は、コマンドラインそれは「こんにちは、世界」をプリントアウトして、クラッシュします

g++ hello.cpp -o hello.exe 

でこのプログラム

#include <iostream> 

using namespace std; 

int main() { 
    cout << "Hello, World" << endl; 

    return 0; 
} 

をコンパイルした場合。しかし、私は次のコマンドラインでコンパイルすると:

g++ -O3 hello.cpp -o hello.exe 

これは全くクラッシュすることなく、完璧に動作します。私は入力プログラムを変更し、それが少し複雑にする場合

今、:しかし、:

#include <iostream> 
#include <string> 

using namespace std; 

int main() { 
    string str; 

    cout << "Enter a string: "; 
    getline (cin, str); 

    if (str == "foo") 
     cout << "You entered foo!" << endl; 
    else 
     cout << "You entered: " << str; 

    return 0; 
} 

最適化オプション(-O3)がなければ、それは「文字列を入力し、」プリントアウトする前にクラッシュしますコード最適化行では、文字列を入力した後にクラッシュします。

最後に、私の質問に。これを修正するには何ができるのですか?それを使用するにはGCCの以前のバージョンに戻すだけですか?また、なぜGCCが簡単なプログラムを正しくコンパイルしないのでしょうか?


更新:エラーがMinGWのインストーラを使ってインストールする場合は、GCCのインストールによって引き起こされ、「最新のリポジトリカタログをダウンロードする」オプションを選択して、それがエラーを再現します。しかし、同じインストーラーを使用し、「あらかじめパッケージ化されたリポジトリー・カタログを使用する」を選択した場合、エラーは存在しなくなります。したがって、MinGW GCCカタログにリストされているバイナリの最新バージョンには何らかのエラーがあります。

+8

あなたのデバッグ用ライブラリをボークしたような音です。最適化が問題を「解決」するという事実は、リリースランタイムライブラリが問題ないことを意味します。しかし、デバッグランタイムライブラリは何らかの形で誤って構成されています。 – Mysticial

+0

しかし、彼は最適化を有効にしてクラッシュすると言った。 –

+0

GCCのインストールに何か問題があったとしたら、何かが壊れている可能性がありますか?それを修正するかどうかを確認するために再インストールして再インストールします。 – Alex

答えて

4

非常によく似た問題に遭遇しました。リリースビルドがうまくいっていて、デバッグビルドが壊れていました。ソリューションには、次のperormしました:

mingw-get update 
mingw-get upgrade 
mingw-get install gcc g++ mingw32-make --reinstall 

これは二重殺したかもしれないが、少なくともそれも「アップグレード」以前のいくつかのライブラリを削除することができませんでしたときに助けました。

+0

私はそれを試み、gccの最新バージョンを再ダウンロードし、これらの3つのコマンドを入力して更新しました。アップグレードし、再インストールします。ただし、クラッシュするプログラムが作成されます。これまでのところ、私が働かせるための唯一の方法は、 "パッケージ化されたリポジトリカタログ"を使用することです。これによりgcc 4.6.2が4.7.0の代わりにインストールされます – Alex