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

时间:2013-09-20 09:42:39

标签: c++ eclipse multithreading c++11 mingw

我正在尝试编译一个在eclipse kepler / mingw 4.8.1和win32上使用std :: thread的简单c ++程序。我希望在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__

构建抱怨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(
  ^

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

您可以检查的另一件事是您已正确安装编译器,验证您的编译器安装,如rubenvb所述。

答案 2 :(得分:0)

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