使用MinGW编译的C ++ Hello World程序崩溃时出现“非法争论”

时间:2013-08-10 00:27:40

标签: c++ eclipse mingw

我决定是时候学习C ++了,在努力让编译器工作3个小时后,我终于创建了一个工作程序。然而,当我试图通过剪切和粘贴它来重构Eclipse中的项目时,它似乎自发地破裂了。该程序简单崩溃,Windows带来了可怕的对话“HelloWorld.exe已停止工作”。一些调试显示“cout”被认为是非法论点。我进一步研究了这个问题,我现在怀疑它与编译器显然是32位有关,因为我有一个64位系统。可执行文件在Eclipse中列为“HelloWorld.exe - [x86 / le]”。 (减去期限。)我的节目如下:

#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调用。

2 个答案:

答案 0 :(得分:3)

查看gdb回溯后,问题似乎是不兼容的C ++运行时libstdc++.dll

如果您在现有安装上安装MinGW,可能会发生这种情况。另一种可能发生的方式是,如果需要libstdc++.dll的其他第三方程序将其依赖项安装到您的Windows\SysWow64中,那么可以在系统范围内找到它。问题当然是,libstdc++的不同版本在ABI级别上彼此不兼容。使用给定的Mingw g ++版本编译的程序需要加载与特定Mingw安装一起提供的对应的 libstdc++.dll

打开一个新的cmd.exe提示符并路径环境设置为当前的mingw\bin安装目录。例如,如果您的mingw安装位于c:\mingw32-4.7.2

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

然后再次尝试运行helloworld.exe。如果它运行完成而没有崩溃,则可能是问题所在。在这种情况下,您应该从windows\syswow64中删除libstdc ++。dll。

答案 1 :(得分:2)

静态构建,因此您不必担心错误的依赖关系。只需添加&#34; -static&#34;编译器选项。