0

C++ を学ぶ時が来たと判断し、コンパイラを動作させるために 3 時間以上苦労した後、ようやく動作するプログラムを作成しました。しかし、Eclipse でプロジェクトをカット アンド ペーストしてリファクタリングしようとすると、自然に壊れたようです。プログラムは単純にクラッシュし、Windows は「HelloWorld.exe が動作を停止しました」という恐ろしいダイアログを表示します。少しデバッグしたところ、「cout」が不正な引数と見なされていたことが明らかになりました。この問題をさらに調べたところ、64 ビット システムを使用しているため、明らかに 32 ビットであるコンパイラと関係があるのではないかと疑っています。実行可能ファイルは、「HelloWorld.exe - [x86/le]」として Eclipse にリストされます。(ピリオドを引いたものです。)私のプログラム全体は以下のとおりです。

#include <iostream>

using namespace std;

int main(){
    cout << "Hello World!" << endl;
    return 0;
}

また、Eclipse で新しい「HelloWorld」C++ プロジェクトを作成しても、変更されていないコードと設定を使用しても、問題を解決することはまったくできないことも発見しました。なぜこれが起こるのかについて誰にも提案がありますか?

編集: デバッグ情報: プログラムの実行時:

Hello World!
Program received signal SIGNILL, Illegal instruction.
0x6fccc3c0 in libstdc++-6!_ZSt4cout ()
    from C:\Windows\SysWOW64\libstdc++-6.dll
(gdb) bt
#0   0x6fccc3c0 in libstdc++-6~_ZSt4cout ()
    from C:\Windows\SysWOW64\libstdc++-6.dll
#1   0x6fc8908c in libstdc++-6~_ZSt4cout ()
    from C:\Windows\SysWOW64\libstdc++-6.dll
#2   0x004013be in libstdc++-6~_ZSt4cout () at HelloWorld.cpp:4
(gdb)

クラスの 4 行目は、cout 呼び出しを指していることに注意してください。

4

2 に答える 2

3

gdb バックトレースを見ると、互換性のない C++ ランタイムに問題があるようlibstdc++.dllです。

これは、既存のインストールの上に MinGW をインストールしている場合に発生する可能性があります。これが発生する可能性のある別の方法は、他のサードパーティ プログラムがlibstdc++.dll依存関係をインストールする必要Windows\SysWow64があるため、システム全体で検出される可能性がある場合です。問題はもちろん、異なるバージョンの がlibstdc++ABI レベルで相互に互換性がないことです。特定の Mingw g++ バージョンでコンパイルされたプログラムは、その特定の Mingw インストールに付属する対応するものをロードする必要があります。 libstdc++.dll

新しい cmd.exe プロンプトを開き、Path 環境を現在のインストール ディレクトリに設定します。mingw\binたとえば、mingw のインストールが次の場所にある場合c:\mingw32-4.7.2:

C:\>set path=C:\mingw32-4.7.2\bin

次に、helloworld.exe をもう一度実行してみます。クラッシュせずに最後まで実行された場合、それが問題である可能性があります。この場合、libstdc++.dll を から削除する必要がありますwindows\syswow64

于 2013-08-10T04:46:59.983 に答える