【问题标题】:Clang segfaults when outputting endl输出 endl 时出现 Clang 段错误
【发布时间】:2014-03-16 05:22:31
【问题描述】:

我正在尝试 Clang(版本 3.4,通过 Windows 预构建的二进制文件),看看它是否可以替代 GCC(版本 4.8.1,使用 MinGW);但是,我无法让一个简单的程序运行。

#include <iostream>

int main()
{
    std::cout << std::endl;
}

Clang 能够编译和链接程序,但运行它会产生SIGSEGV 信号和0xC0000005 的返回码。输出字符串可以正常工作,但std::flush 会导致相同的结果,尽管允许流自动刷新本身是可以的。

调试程序只显示一个调用堆栈,其中包含__mingw_CRTStartup()(Clang 使用 libstdc++,因为它没有安装 libc++)和std::cout ()。这可能是什么原因造成的,如何解决?

编辑:在使用其他 ostream 操纵器(例如 std::decstd::unitbuf)时也会发生同样的情况。

【问题讨论】:

  • 我猜你的标准库版本不匹配。你是如何安装 libstdc++ 的,你是如何编译和链接你的可执行文件的?
  • @NateKohl 我正在使用由 mingw-get 与 GCC 的其余部分一起安装的 libstdc++ 版本。至于编译,我在命令行中使用clang++ a.cpp
  • 可能添加“return 0”或替换为“void main()”
  • @Kyle 这可能是一个愚蠢的建议,但请确保您的库路径指向正确的标准库(即安装的一个 MinGW,而不是您系统上以前已经存在的任何一个)。可以肯定的是,查看 MinGW 将它的库放在哪里并使用 -l 标志来确保它正在链接。

标签: c++ segmentation-fault clang


【解决方案1】:

LLVM 3.4 regarding a similar issue 存在一个待处理的错误。这个问题似乎是 LLVM 3.4 和 MinGW 4.7+ 之间的 ABI 不兼容导致 i686 指令被拾取而不是选定的目标。

在 x64 Windows 上可能的解决方案是使用MinGW64 build。这应该可行,但正确获取标准库头文件可能会很棘手。

推荐的解决方案是follow the steps here,调整系统上的目标和任何路径,然后编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多