我决定是时候学习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调用。
答案 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;编译器选项。