MinGW错误:'thread'不是'std'的成员。

19

我正在尝试为Windows交叉编译一个简单的应用程序:

#include <thread>

void Func(){
  return;
}

int main(){
  std::thread thr1(Func);
  thr1.detach();
  return 0;
}

这就是我得到的结果:

$ i686-w64-mingw32-g++ -static-libstdc++ -static-libgcc -pipe -g -std=c++0x ./threadstutor.cpp 
./threadstutor.cpp: In function ‘int main()’:
./threadstutor.cpp:8:3: error: ‘thread’ is not a member of ‘std’
./threadstutor.cpp:8:15: error: expected ‘;’ before ‘thr1’
./threadstutor.cpp:9:3: error: ‘thr1’ was not declared in this scope

实际上,如果在Ubuntu上使用g++编译此代码,则没有这样的问题;但是我需要交叉编译Windows版本,而我现在卡住了。


8
如果您在Windows上进行编译,需要使用Mingw-Builds v4.8.1 with posix-threads: http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.8.1/64-bit/threads-posix/sjlj/。您可以选择sjlj或seh。 Seh只适用于x64,sjlj适用于x32和x64。 - Brandon
@CantChooseUsernames 尽管如果我找不到解决方案,我可以将其用作某种解决方法:通过Wine运行MinGW编译源代码。虽然这很奇怪:D 顺便说一句,我的编译器版本是否不支持 _std::thread_? - Hi-Angel
尝试打印 g++ --version 并确保它实际上使用的是正确的版本。除此之外,我不确定为什么您无法使用 std::thread。奇怪。 - Brandon
@CantChooseUsernames 是的,我确定。 $ ./i686-w64-mingw32-g++ --version 显示 i686-w64-mingw32-g++ (GCC) 4.9.0 20131227 (experimental).....,而且 $ ./i686-w64-mingw32-g++ ~/Projects/WinCrossCmplng/StilsoftTest/threadstutor.cpp -static-libstdc++ -static-libgcc -pipe -g -std=c++11 仍然报同样的错误 ...error: ‘thread’ is not a member of ‘std’... 对于糟糕的格式化表示抱歉。 - Hi-Angel
1
@CantChooseUsernames 我发现了一件奇怪的事情!我刚刚尝试下载MinGW的Windows版本并在wine上运行。然后...它可以工作!版本号是_4.8.1_,肯定比我之前尝试的版本低。无论如何,它可以工作! - Hi-Angel
显示剩余7条评论
4个回答

17

已经有更好的选择了:https://github.com/meganz/mingw-std-threads。这是一个轻量级的win32本地实现,用于MinGW最常使用的C++11线程和同步类。这些类实现在一个仅包含头文件的库中,可以与系统库共存。它还支持Windows XP,该操作系统没有条件变量的直接模拟。


17

4
安装失败。显示“无法下载repository.txt [0]”。 - Naveen Kumar
通过 sudo apt-get install mingw-w64 在 Linux 上安装 Mingw 怎么样? - ar2015
1
@NaveenKumar看这里:https://dev59.com/NK3la4cB1Zd3GeqPNn5q - 我通过chocolatey软件包管理器解决了这个问题。 - Mindaugas Bernatavičius

0

std::thread 在C++11中被引入,但您的编译器并不是用于C++11(或更高版本)。请看一下您展示的命令:

$ i686-w64-mingw32-g++ -static-libstdc++ -static-libgcc -pipe -g -std=c++0x ./threadstutor.cpp

-std=c++0x 是在C++11正式发布之前使用的。应该改为使用 -std=c++11

参考 -std=c++0x 和 -std=c++11 有何不同


1
你所提到的问题有一个被接受的答案,声称对于在C++11稳定之前的编译器而言,“c++0x”和“c++11”是相同的。还要注意最后一句话:“当编译器同时支持两者时,它们应该是相同的”。可以推测,在这里问题的上下文中,“不稳定”的API意味着缺乏“std∷threads”。然而,根据我记得和这里被接受的答案的判断,问题仅仅是MinGW维护者做出了发布两个版本的奇怪决定:一个带有线程支持,一个没有。 - Hi-Angel

0

1
有比手动设置这个库更简单的解决方案。您只需安装MinGW-w64(其众多发行版之一),它应该默认具有多线程库功能。 - HolyBlackCat
1
这个建议似乎已经在这里的答案中提到过了。 - Hi-Angel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接