为啥这段代码不能用 clang 构建,用 gcc 崩溃,但用 VC++ 运行良好? [复制]

Posted

技术标签:

【中文标题】为啥这段代码不能用 clang 构建,用 gcc 崩溃,但用 VC++ 运行良好? [复制]【英文标题】:Why this code doesn't build with clang, crashes with gcc, but runs fine with VC++? [duplicate]为什么这段代码不能用 clang 构建,用 gcc 崩溃,但用 VC++ 运行良好? [复制] 【发布时间】:2014-11-23 23:47:48 【问题描述】:

这段代码:

#include <iostream>
#include <future>

int main()

    std::async([]std::cout << "hello\n";).get();

运行良好并使用 Visual C++ 2013 打印 hello,但在 gcc 生成时抛出异常:

terminate called after throwing an instance of 'std::system_error'
what():  Unknown error -1

甚至不使用 clang 构建,产生以下错误消息:

/usr/bin/ld: /tmp/source-83f28e.o: undefined reference to symbol 'pthread_setspecific@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我使用rexter 运行测试。你能解释一下这种行为吗?

编辑

使用-pthread 编译器选项 gcc 版本运行良好,clang 版本现在构建并生成:

hello
exception_ptr not yet implemented

【问题讨论】:

你使用过-pthread标志吗? 这并不是真正的“崩溃”。 @juanchopanza 标记为重复这是正确的,尤其是在事后诸葛亮的帮助下。 Clang 错误消息导致链接器选项,但 gcc 消息 - 根本没有。 【参考方案1】:

为了添加对多线程的支持,您需要链接 pthread 库。这是 GCC 和 Clang 上的 -pthread(作为内置标志提供)。或者,-lpthread 可以解决问题。

【讨论】:

以上是关于为啥这段代码不能用 clang 构建,用 gcc 崩溃,但用 VC++ 运行良好? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

FreeBSD 为啥要废弃 GCC 改用 Clang/LLVM

为啥 GCC 不能消除多个继承函数的歧义(但 clang 可以)? [复制]

为啥 clang 无法展开循环(即 gcc 展开)?

mac 使用gcc 为啥编译错误是clang 提示

为啥clang用-O0(对于这个简单的浮点总和)产生效率低下的asm?

为啥 clang 和 gcc 在这个虚拟继承代码上存在分歧?