【问题标题】:I installed mingw32-pthreads-w32 but I still cannot compile std::mutex我安装了 mingw32-pthreads-w32 但我仍然无法编译 std::mutex
【发布时间】:2017-04-27 12:57:49
【问题描述】:

根据这里关于堆栈溢出的建议,我安装了 mingw32 pthread 包:

但我仍然无法使用 C++11 多线程编译代码:

 error: 'mutex' in namespace 'std' does not name a type

我使用我使用 mingw32-make 执行的 makefile,它使用位于 C:\MinGW\bin\g++.exeg++

G++ 版本:g++.exe (GCC) 5.3.0 Mingw32 制作版本:GNU Make 3.82.90Built for i686-pc-mingw32

我使用-M 选项来生成已使用的标头列表,这就是我所拥有的:

 c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\thread \
 c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\mutex \

我什至不确定这些标题是否正确。

可能出了什么问题?我该如何解决这个问题?

【问题讨论】:

  • 显示您使用的代码,以便我们知道您没有忘记#include <mutex>。同时发布g++ --version 的结果可能会有用。以及如何调用编译器。
  • 不,我没有忘记包含互斥锁,代码编译得很好并且可以在 linux 上运行。当我使用带有它自己的 MinGW 版本的 Qt Creator 编译时,它也会在 Windows 上编译。
  • 我建议你获取 MinGW64: sourceforge.net/projects/mingw-w64 。原来的 MinGW 很久没有维护了。 Qt creator 带有 MinGW64(它不是他们自己的版本)。你可以从那里使用mingw(Qt)或下载我给你的。要使 std 线程正常工作,您需要 posix 线程。

标签: c++ g++ mingw


【解决方案1】:

GCC for Windows 带有两个线程模型:win32 和 posix。只有posix线程模型支持标准多线程库。

要检查这一点,请尝试运行 g++ -v。如果您没有看到--enable-thread=posix,则表示您的编译器套件不支持标准多线程库。

您可以从 https://sourceforge.net/projects/mingw-w64/ 下载 Mingw64 GCC,它们是使用 --enable-thread=posix 构建的。

请注意,尽管--enable-thread=posix 意味着您可以使用标准的多线程库,但实现比直接使用CreateThread 等Win32 API 慢得多。这是因为对于 GCC,std::thread 等是在 gthread 之上实现的,gthread 是基于 pthread 实现的。由于 Windows 不支持pthread,Mingw64 团队使用 Win32 API 实现pthread。你可以看到你需要支付相当多的抽象债务。

如果性能对您很重要,您可能不想使用它。您还需要将winpthread.dll 分发给最终用户,因为静态链接不起作用。

如果您希望您的代码在所有平台上都可以工作,那么使用它就可以了。

【讨论】:

  • 感谢您的详细解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多