std::thread 不是使用 Eclipse Kepler MinGW 命名空间 std 的成员

Posted

技术标签:

【中文标题】std::thread 不是使用 Eclipse Kepler MinGW 命名空间 std 的成员【英文标题】:std::thread is not a member of namespace std using Eclipse Kepler MinGW 【发布时间】:2013-09-20 09:42:38 【问题描述】:

我正在尝试编译一个简单的 c++ 程序,该程序在 eclipse kepler / mingw 4.8.1 和 win32 上使用 std::thread。我希望在多年的 windows 开发之后的某个时候将开发转移到 linux。

#include "test.h"
#include <thread>
#include <algorithm>


int main()

    Test::CreateInstance();

    std::thread(
        [&]()
        
            Test::I()->Output2();
        
    );

    Test::DestroyInstance();
    return 0;

忽略测试的目的(它是一个单例,只产生一些输出,一旦我让 std::thread 工作,我将对其进行扩展!)

我在 Eclipse 中设置的 g++ 编译器设置是:

-c -fmessage-length=0  -std=c++0x -Wc++0x-compat

我定义的预处理器符号是:

__GXX_EXPERIMENTAL_CXX0X__

Building 抱怨 std::thread 不是 std: 的成员

    10:30:13 **** Incremental Build of configuration Debug for project test ****
Info: Internal Builder is used for build
g++ -D__GXX_EXPERIMENTAL_CXX0X__ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -Wc++0x-compat -o main.o "..\\main.cpp" 
..\main.cpp: In function 'int main()':
..\main.cpp:11:2: error: 'thread' is not a member of 'std'
  std::thread(
  ^

有人可以建议我可能缺少什么来正确编译吗?

【问题讨论】:

您使用的是哪个版本的MinGW?还有 dont you have to link against pthread` 吗? 我正在使用 mingw v4.8.1。我不认为我在使用 pthreads。我以为我在使用 std::thread?它们是一样的吗? 【参考方案1】:

普通 MinGW 不支持std::thread。您将需要使用启用了“posix”线程的 MinGW-w64 工具链(例如 Qt 5 附带的工具链),以便 libstdc++ 公开&lt;thread&gt;&lt;mutex&gt;&lt;future&gt; 功能。

您可以找到安装程序here,但您也可以尝试将整个mingw 工具链根文件夹替换为one of these packages。你可以选择32位或64位,如果你想和std::thread和朋友一起玩,记得选择threads-posix。除了您已经拥有的那些之外,不需要特殊的编译器选项。如果您不需要 GCC 4.6 兼容性,我建议您使用 -std=c++11

【讨论】:

不是编译器支持的问题,编译器不知道也不关心线程。缺少实现的是标准库。请参阅下面的答案以获得本机轻量级解决方案,而不是在 Windows 上使用 pthread 仿真。【参考方案2】:

虽然我使用的是 Cygwin 编译器,但我也遇到了同样的问题。我所做的是为预处理器定义符号__cplusplus 和值201103L。我还为编译器使用了标志-std=c++11。必须为所有配置(调试和发布)进行此设置。

您可能要检查的另一件事是您已正确安装编译器,按照 rubenvb 的说明验证您的编译器安装。

【讨论】:

-std=c++11 应该相应地设置__cplusplus。你应该永远自己设置__cplusplus【参考方案3】:

请参阅此处了解可以添加到任何 C++11 版本的 MinGW 的本机实现: https://github.com/meganz/mingw-std-threads 它是一个仅包含头文件的库,因此您只需在项目中包含头文件,您将获得 C++11 线程和同步原语。

【讨论】:

以上是关于std::thread 不是使用 Eclipse Kepler MinGW 命名空间 std 的成员的主要内容,如果未能解决你的问题,请参考以下文章

std::thread 错误(线程不是 std 的成员)

使用 ASIO 和 std::thread 制作 C++11 应用程序时对“pthread_create”的未定义引用错误

C++11 的 std::thread 是不是与 POSIX 信号量兼容?

C++ 中的 std::thread 库是不是支持嵌套线程?

分离的 std::thread 终止后是不是需要删除?

如何知道分离的 std::thread 是不是已完成执行?