std::thread 适用于 cygwin 但不适用于 MinGw

std::thread works in cygwin but not in MinGw

所以我决定今天尝试一下 C++。我下载了 MinGw 和它附带的 g++ 编译器。我决定测试以下代码:

#include <iostream>
#include <thread>

int foo()
{
    std::cout << "foo" << std::endl;
}

int main()
{
    std::thread t1(foo);
    t1.join();
    std::cout << "done" << std::endl;
    return 0;
}

然后我尝试使用以下行在命令行上编译它:

g++ -std=c++11 main.cpp

适用于 hello world。然而这一次,它给了我这个错误:

error: 'thread' is not a member of 'std'

我使用 cygwin 提供的 g++ 尝试了完全相同的代码,它有效。那么为什么它在 MinGw 中不起作用?它是过时的还是什么?我想像在 cygwin 终端上一样使用 c++11 和 c++14 编译东西,但在 cygwin 环境之外。

MinGW-w64(或者更确切地说 windows 上的 GCC)如果您想使用 std::thread,则需要使用 posix 线程支持进行编译,大概您下载了带有原生 windows 线程。

查看针对 64 bit or 32 bit 的 mingw-builds 文件夹并选择具有 posix 线程的版本。您还需要选择异常处理方法,如果您没有理由选择其他方法,则坚持 GCC 默认值 seh 用于 64 位,dwarf 用于 32.

我在 linux (cross-compiling) 中对此进行了测试。

编译成功,

i686-w64-mingw32-g++-posix -std=c++11 threads.cpp -lwinpthread

这不是

i686-w64-mingw32-g++-win32 -std=c++11 threads.cpp -lwinpthread

编译器之间的区别是 --enable-threads=win32 与构建编译器时使用的 --enable-threads=posix 选项。 g++ -v 应该显示使用了什么。