【问题标题】:gcc 6.2.0 thread is not a member of stdgcc 6.2.0 线程不是 std 的成员
【发布时间】:2016-12-04 16:23:36
【问题描述】:

计划:

#include <thread>

int main(void)
{
    std::thread t;
    return 0;
}

test.cpp: In function ‘int main()’:
test.cpp:6:5: error: ‘thread’ is not a member of ‘std’
    std::thread t;
    ^~~

GCC 信息:

$ g++ test.cpp -H
. /home/nathan/development/toolchain/gnu/x86_64-unknown-linux-gnu/include/c++/6.2.0/thread

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/home/nathan/development/toolchain/gnu/x86_64-unknown-linux-gnu/libexec/gcc/x86_64-pc-linux-gnu/6.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc/configure --prefix=/home/nathan/development/toolchain/gnu/x86_64-unknown-linux-gnu --enable-languages=c,c++,fortran --disable-multilib --enable-threads=posix --enable-libstdcxx-threads
Thread model: posix
gcc version 6.2.0 (GCC)

使用 STL 的其他部分工作正常,只有 thread 失败。我是不是 遗漏了什么?配置后,GCC 会采用线程模型。

编辑 1

使用--enable-threads 重新编译 GCC。仍然产生同样的错误。

编辑 2

使用--enable-libstdcxx-threads 重新编译 GCC。仍然产生同样的错误。

编辑 3

使用--enable-threads=posix 重新编译 GCC。仍然产生同样的错误。

编辑 4

想说明我是使用分支 gcc-6_2_0-release 上的 repo 构建的。

【问题讨论】:

  • 您可能已经构建了 gcc,但没有对 C++ 的线程支持。试试g++.exe -dM -E -x c++ -std=c++11 test.cpp | egrep '_GLIBCXX_HAS_GTHREADS|_GLIBCXX_USE_C99_STDINT_TR1。如果您没有看到这两个定义,则您的构建没有线程支持。不知道是否还需要--enable-threads
  • 我只看到#define _GLIBCXX_USE_C99_STDINT_TR1 1。我猜我用--enable-threads 重建。为什么这不是 2016 年的默认值?
  • @n.m.我刚刚用--enable-threads 完成了构建,但我仍然遇到同样的错误。我还缺少其他东西吗?
  • 不知道。 grep 构建日志以获取有关线程的消息。
  • 不应该是--enable-threads=posix吗?我认为gcc配置文档中提到了这一点:gcc.gnu.org/install/configure.html

标签: multithreading c++11 gcc stl


【解决方案1】:

在多次尝试使用 repo 源构建后,我最终放弃了,并使用来自 GNU 镜像的已发布 tarball 进行编译。不确定哪些选项会与 repo 中的内容和发布的内容有所不同,但我只是使用了:

--enable-languages=c,c++ --disable-multilib

一切都按预期进行。

【讨论】:

  • 很高兴知道,我想我会记下始终使用发行版压缩包...您可以尝试查看它们是否在某处有“发行 gcc”说明?可能确实有一些额外的准备步骤,比如从其他 repos 复制代码之类的。
猜你喜欢
  • 2019-01-31
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多