std :: endl崩溃使用MinGW编译的Windows 8

use*_*560 10 c++ mingw flush endl

我有3台计算机,其中两台使用Windows 8.使用最新版本的MinGW的g ++(4.8.1-4),我的hello world程序会在我在Windows 8计算机上编译和运行时冻结,但不会在Windows 7中运行.

#include <iostream>
int main()
{
    std::cout << "Hello, World!" <<std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这在g ++中编译得很好,但运行a.exe会显示"Hello,World!" 然后会弹出一个窗口并说"a.exe已停止工作,Windows可以在线检查程序的解决方案......"等.

有没有人见过这个问题.

另外,我试过"std :: cout <<"Hello,World!\n"<< std :: flush;" 这也有同样的问题.似乎每个刷新缓冲区的函数都会导致崩溃.

按照Eric的建议,我重新编译了程序并在gdb中运行它并得到以下输出:

Program received signal SIGILL, Illegal instruction. 
0x00405065 in _Jv_RegisterClasses ()
Run Code Online (Sandbox Code Playgroud)

Cli*_*ord 6

在第二个实例中,'\n'应该在任何情况下都会导致输出刷新,尽管在Windows中我认为控制台输出是立即的(或者在短暂超时之后可能是自动的),在任何情况下都没有显式刷新.

我建议进行以下实验:

1)通过使用C库查看它是否特定于C++库(在MinGW中使用Microsoft的C运行时而不是glibc):

#include <stdio.h>
int main()
{
    printf( "Hello, World!\n" ) ;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

2)通过以下方式消除退出代码:

int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

3)根本没有新行:

#include <iostream>
int main()
{
    std::cout << "Hello, World! ;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

4)尝试不同的编译器选项,例如优化级别,或者-fno-builtin例如,或者建议在这里:-static-libgcc -static-libstdc++(虽然我怀疑``-static-libgcc`本身会产生什么影响,因为MinGW的使用Microsoft的C运行时DLL和静态库仅适用用微软的工具).

  • 这很有效.你是对的 - 静态 - libgcc旗帜没有帮助; 只有-static-libstdc ++标志才能解决问题.另外,-fno-builtin也没有解决它.我是一个相当有经验的python程序员,但显然我现在正在学习c ++.您是否介意猜测这个编译器标志究竟是如何解决我的问题的呢? (2认同)
  • @ user1276560:没有`-static-libstdc ++`,标准C++库将由*动态链接库*而不是静态链接库提供.可能在该库的MinGW构建中存在一些不兼容性,这在静态库构建中不存在.您可能会发现,因此您的可执行文件稍大一些,但从好的方面来说,它可以重新分发,而无需确保DLL随其一起分发. (2认同)