【问题标题】:Why does string type cause c++ program to not run?为什么字符串类型会导致c++程序无法运行?
【发布时间】:2018-08-29 19:08:49
【问题描述】:

我有一个简单的程序,用 C++ 编写,在 Windows 10 机器上,用 MinGW g++ 编译器编译。

我包含<string> 标头,它运行良好。当我包含string 数据类型时,它会编译,但不会运行。

重现这个的最少代码量是:

#include <iostream>
#include <string>
using namespace std;

int main() {
    string greeting;
    cout << "hi" << endl;
    return 1;
}

请注意,工作正常:

#include <iostream>
#include <string>
using namespace std;

int main() {
    //string greeting;
    cout << "hi" << endl;
    return 1;
}

编译器版本为6.3.0
g++.exe (MinGW.org GCC-6.3.0-1) 6.3.0

我在 3 天前下载了它,所以我认为它是最新版本。 (也许不是?)

我已经用谷歌搜索并浏览了 stackoverflow 以寻找答案。

我能找到的最接近的问题是,这个人放弃并更换了操作系统。

我发现的另一个解决方案是使用 Cygwin 的编译器。我宁愿不这样做,因为我已经有了一个看似不错的编译器。看来 MinGW 工具被广泛使用,我应该可以使用编译器。

任何其他论坛/博客/等资源在转换字符串或调用字符串方法方面存在问题。

注意:完全相同的代码在 Ubuntu 16.04 上运行良好,附带编译器。

编辑:

虽然我意识到“它不运行”没有帮助,但我不知道如何描述它。我运行编译后的程序,它的行为与我输入echo '' 相同。没有输出,没有任何迹象表明发生了什么事。表达这种行为最有用的方式是什么?

如果我使用调试器,我会得到program exited with code 0xc0000139

快速谷歌搜索返回的结果表明它编译器的问题。与下面关于我的编译器版本的 cmets 相同...

为了编译程序,我运行g++ main.cpp -o b.exe 要执行它,我运行./b.exe

【问题讨论】:

  • 运行程序时收到什么错误信息?是否缺少 C++ 运行时库?
  • 1) OT: "所以我认为它是最新版本。" GCC 6.3.0 的发布日期是 2016 年 12 月 21 日,所以,不,它是远远落后于最近的版本。 2)“程序将无法运行”是无用的问题描述。就像打电话到维修店​​,说你的车不能开,并要求他们解释它有什么问题。
  • "为什么字符串类型会导致 c++ 程序无法运行?" - 使用std::string 本身不会导致程序无法运行。你还有其他问题
  • 编译器可能会优化掉 string 变量,因为它没有在程序中使用,从而使两个示例等效。
  • 使用g++ -S main.cpp。打开main.s。搜索“问候”。我发现 g++ 5.3.0(在 Cygwin,Windows 7 上)正在优化 string。此外,该程序对我来说也可以正常工作;无法重现该问题。

标签: c++ mingw


【解决方案1】:

Mingw 在某些控制台上存在长期问题(请参阅他们的 faq)。可能值得检查它是否无法输出而不是通过例如执行。重定向到文件./b.exe &gt;out.txt

【讨论】:

  • 应该是评论。
  • 没有足够的声誉来发表评论!
  • 感谢@alter igel
  • “没有足够的声誉来发表评论”并不意味着“所以你可以在错误的地方发表评论”
【解决方案2】:

在一些有用的 cmets 和很多挫折之后,我决定尝试构建最新的编译器。我屈服并使用了 Cygwin。 (我对 Cygwin 真的没有问题,我只是想让 MinGW 工作。)

我按照这个网站的说明进行操作(从https://gcc.gnu.org 下载当前源代码后)。

http://preshing.com/20141108/how-to-install-the-latest-gcc-on-windows/

注意事项:

  • 这是针对旧版本的 gcc,但我将相应的版本号替换为 8.2.0(当前为当前版本)。

  • 我缺少一些先决条件,必须将cd 进入源目录并从 Cygwin 终端运行 ./contrib/download_prerequisites。它无缝地处理了所有事情,虽然花了一点时间,但我现在可以使用string 数据类型并运行程序(成功)。

  • 不要忘记最后的make install 命令。我做了,而且很头疼。

最后,感谢所有帮助 cmets,以及那些要求澄清的人。当我打电话给机械师说“我的车开不了”时,他们会提出一些有用的问题,我们会一起努力为他们提供所需的相关信息。这就是上面发生的事情,我学到了一些东西(并解决了我的问题)。

【讨论】:

    【解决方案3】:

    我有同样的问题。我从 sourceforge 下载了 mingw 几天,除了我声明一个字符串外,一切都很好。然后它会显示没有输出。也许是旧版本(6.3.0)有问题。我删除了所有文件并使用给定的教程重新安装:https://code.visualstudio.com/docs/cpp/config-mingw。这是一个较新的版本(8.1.0)。现在它工作得很好!

    【讨论】:

    • 您是否考虑在笔记本电脑上安装Debian,并在笔记本电脑上安装最近 GCC 10?您可以将其调用为g++ -Wall -Wextra -g 以获取警告,然后您将使用GDB 调试器。当然,您需要阅读有关 C++(一种非常难的编程语言)的书籍
    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多