'thread'不是GCC 4.8中'std'的成员

'thread' is not a member of 'std' in GCC 4.8

本文关键字:std 成员 GCC thread 不是      更新时间:2023-10-16

我正在为我当前的项目尝试一些c++11线程支持,但面临瓶颈。我使用了由rubendb构建的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的实验(也是由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

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

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

posix(建立在MinGW-w64的winpthreads之上)"posix的实现win32的线程也可以在实验目录下找到。

  • 它的主要目标是支持C++11标准线程,它支持目前仅使用POSIX线程。"http://mingw-w64.sourceforge.net/
  • 启用C++11库功能包含在头线程、互斥对象和future中
  • 性能在特定情况下的退化。C++11的功能是明显慢于本机Win32实现,甚至MSVS2012的实施

win32使用本机win32线程功能。

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

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