【问题标题】:'thread' is not a member of 'std' in GCC 4.8'thread' 不是 GCC 4.8 中'std' 的成员
【发布时间】:2014-09-20 17:46:03
【问题描述】:

我正在为我当前的项目尝试一些 c++11 线程支持,但面临瓶颈。我使用 rubenvb 构建的 gcc 4.8.0(直接从 sourceforge 下载)[x86_64-w64-mingw32-gcc-4.8.0-win64_rubenvb],发现它似乎不支持 c++11 线程功能。以下代码编译失败并报错'thread' is not a member of 'std'。通过谷歌搜索,有一个 4.7-experimental(也由 rubenvb 构建),支持 std 线程。由于我的主要项目的一部分需要 4.8 版本的其他 C++11 功能,我还没有尝试 4.7 版本。请帮助澄清我下载的工具链是否启用了线程。

平台:Window x64,Qt 4.8(使用下载的 gcc 工具链从源代码构建)

  • 由于 Qt 库是从源代码构建的,因此更改工具链将意味着重新编译整个库集,这对我来说听起来很糟糕。两个文件或 gcc 中是否遗漏了什么?谢谢。

更新:刚刚下载了实验4.8版本[x86_64-w64-mingw32-gcc-4.8-stdthread-win64_rubenvb]并编译测试代码。所以现在的问题是

“‘实验’版本可以安全使用吗?”

使用的测试代码

#include <iostream>
#include <thread>
#include <mutex> // try other c++11 threading feature

void doSomeWork( void ) { std::cout << "hello from thread..." << std::endl; }
int main() {
    std::mutex m; // also fail here
    std::thread t( doSomeWork );
    t.join();
    return 0;
}

使用的makefile

CC       := g++
SRC      := test$(BUILD).cpp
OBJ      := $(SRC:.cpp=.o)
BIN      := test$(BUILD).exe
CXXFLAGS := -std=c++0x -Wall -Wextra -O0 -ggdb -lpthread -mthreads -pthread -Wno-unknown-pragmas

clean  :        ; del /a/s $(BIN) $(OBJ)
all    : $(BIN) ; del $(OBJ)
$(BIN) : $(OBJ) ; $(CC) $(CXXFLAGS) $^ -o $@
%.o    : %.cpp  ; $(CC) -c $(CXXFLAGS) $< -o $@
.PHONY: clean all

【问题讨论】:

  • 你能从命令行试试吗? g++ -std=c++0x -Wall -Wextra -O0 -ggdb -lpthread -mthreads -pthread -Wno-unknown-pragmas test${BUILD}.cpp?

标签: c++ c++11 stdthread


【解决方案1】:

如果您使用的是 win32,那么 Mingw-Builds 似乎有两种不同的线程模型:

Mingw-Builds(和实验性的 rubenvb 包​​)也让你 在 (lib)gcc 内部使用的线程模型之间进行选择:

posix(建立在 MinGW-w64 的 winpthreads 之上)“POSIX 的实现 在experimental目录下也可以找到win32的threads。

  • 它的主要目标是支持C++11标准线程,它支持 目前只使用 POSIX 线程。” http://mingw-w64.sourceforge.net/
  • 启用 C++11 库功能 包含在标头线程、互斥体和未来中。
  • 性能 特定场景下的退化。 C++11 功能是 比本机 Win32 实现甚至慢得多 MSVS2012 的实现。

win32 使用原生 Win32 线程 职能。

  • 没有 C++11 线程、互斥体或未来
  • 最佳性能

来源:http://qt-project.org/wiki/MinGW-64-bit

【讨论】:

  • 谢谢回复,但我写的测试代码只是一个普通的C++,没有与qt相关的代码,它只是失败
  • 不一定要用Qt。上面的链接没有引用 Qt 而只是 rubenvb 包​​
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 2018-01-07
  • 2019-07-04
  • 1970-01-01
  • 2019-08-07
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多