10

我有 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 << "Hello, World!\n" << std::flush;" 这也有同样的问题。似乎每个刷新缓冲区的函数都会导致崩溃。

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

Program received signal SIGILL, Illegal instruction. 
0x00405065 in _Jv_RegisterClasses ()
4

2 回答 2

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例如,或者按照这里的建议:(-static-libgcc -static-libstdc++尽管我怀疑 ``-static-libgcc` 本身会产生任何影响,因为 MinGW 使用 Microsoft 的 C 运行时 DLL 并且静态库仅可用使用微软的工具)。

于 2013-12-16T22:45:28.053 回答
0

我遇到了同样的问题,经过长时间的痛苦搜索后发现我的计算机上有多个版本的 mingw 提供的 libstdc++-6.dll。一个是 mingw 安装的一部分,另一个是其他安装包(gnuplot 和 GIMP)的一部分。由于我的 PATH 中有 gnuplot,因此编译的 mingw exe 将使用该 dll 的较旧、不兼容的版本,并因所描述的症状而崩溃。因此,我可以证实 Dietmar Kühl 的怀疑。正如上面所建议的那样,静态链接库显然有助于在这种情况下,因为库函数在编译时包含在 exe 中。

于 2017-09-03T20:04:16.423 回答