我有3台计算机,其中两台使用Windows 8.使用最新版本的MinGW的g ++(4.8.1-4),只要我在Windows 8计算机上编译和运行,而不是在Windows 7中运行,我的hello world程序就会冻结。
#include <iostream>
int main()
{
std::cout << "Hello, World!" <<std::endl;
return 0;
}
这在g ++中编译得很好但运行a.exe会显示“Hello,World!”然后会弹出一个窗口并说“a.exe已停止工作,Windows可以在线检查程序的解决方案......”等。
有没有人见过这个问题。
另外,我试过“std :: cout&lt;&lt;”Hello,World!\ n“&lt;&lt; std :: flush;”这也有同样的问题。似乎每个刷新缓冲区的函数都会导致崩溃。
根据Eric的建议,我重新编译了程序并在gdb中运行并获得了以下输出:
Program received signal SIGILL, Illegal instruction.
0x00405065 in _Jv_RegisterClasses ()
答案 0 :(得分:6)
在第二个实例中,'\ n'在任何情况下都应该导致输出刷新,尽管在Windows中我认为控制台输出是立即的(或者在短暂超时之后可能是自动的),在任何情况下都没有显式刷新。
我建议进行以下实验:
1)通过使用C库查看它是否特定于C ++库(在MinGW中使用Microsoft的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)尝试不同的编译器选项,例如优化级别,或-fno-builtin
,或建议here:-static-libgcc -static-libstdc++
(尽管我怀疑``-static-libgcc`本身由于MinGW使用Microsoft的C运行时DLL,静态库仅适用于Microsoft的工具,因此具有任何效果。
答案 1 :(得分:0)
我有同样的问题,经过长时间的痛苦搜索后发现我有多个版本的mingw提供了libstdc ++ - 6.dll在我的电脑上。一个是mingw安装的一部分,其他是其他安装包(gnuplot和GIMP)的一部分。因为我在我的PATH中有gnuplot编译的mingw exe它将使用这个dll的旧的,不兼容的版本并且与描述的症状崩溃。因此,我可以确认DietmarKühl的怀疑。如上所述,在这种情况下,静态链接库显然有帮助,因为库函数在编译时包含在exe中。