【问题标题】:std::endl crashes Windows 8, compiled using MinGWstd::endl 使 Windows 8 崩溃,使用 MinGW 编译
【发布时间】:2014-01-04 11:26:07
【问题描述】:

我有 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

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

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

【问题讨论】:

  • 尝试在调试器下运行;它至少会告诉你失败在哪里。
  • 好的,我运行 gdb 并显示“程序收到信号 SIGILL,非法指令。_Jv_RegisterClasses () 中的 0x00405065”
  • 我认为最可能的原因是标准 C++ 库是使用某些运行时加载库的不兼容版本编译的,最类似于某些基础库。
  • 抱歉之前的评论,我不知何故跳过了你问题的最后一行。 Eric 的建议似乎是目前最好的。检查整个堆栈跟踪,如果它晦涩难懂或难以阅读,请在此处发布,我们会提供帮助。此外,检查控制台的编码/代码页也可能有所帮助,但我看不出它是如何使应用程序崩溃的。在最坏的情况下,它应该只输出奇怪的符号而不是文本。
  • 试试 std::cout

标签: c++ mingw flush endl


【解决方案1】:

在第二种情况下,'\n' 在任何情况下都应该导致输出刷新,尽管在 Windows 中,我相信控制台输出在任何情况下都是即时的(或者可能在短暂超时后自动),而无需显式刷新。

我建议进行以下实验:

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

#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 的工具)。

【讨论】:

  • 这行得通。您对 -static-libgcc 标志没有帮助是正确的;只有 -static-libstdc++ 标志能够解决问题。此外, -fno-builtin 也没有修复它。我是一个相当有经验的 python 程序员,但显然我现在只是在学习 c++。你介意猜测一下这个编译器标志究竟是做什么来解决我的问题的吗?
  • @user1276560:如果没有-static-libstdc++,标准 C++ 库将由 动态链接库 而不是静态链接库提供。该库的 MinGW 构建中可能存在一些不兼容,而静态库构建中不存在。您可能会发现,您的可执行文件因此有点大,但从好的方面来说,它可以重新分发,而无需确保 DLL 与它一起分发。
  • @viveksinghggits :这不是 SO 的工作方式。如果您有问题,请发布问题。评论不适合此目的,您可能会获得评论的唯一受众是我和其他任何对此特定答​​案发表评论的人。 SO 不是讨论论坛。而且这个答案已经有两年多了!代码可能由于多种原因而崩溃;你的原因不太可能与这个问题有任何关系。
【解决方案2】:

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

【讨论】:

  • 这不是答案。这个问题是 3 年前回答的,那你为什么发布一个你知道不能解决问题的答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多