【问题标题】:Meaning of options in mingw-w64 installermingw-w64 安装程序中选项的含义
【发布时间】:2015-07-08 22:47:28
【问题描述】:

在 MinGW-W64 在线安装程序中,您可以选择几个字段。但是我找不到任何关于此的文档,而且我所做的猜测并没有给我想要的行为。

显然,这个项目已经投入了大量的工作,因此遗憾的是,由于缺乏基本的文档而阻碍了采用。

“版本”和“架构”字段是不言自明的,但我遇到问题的其他字段是(显示为当前安装程序的值):

  • 线程,选项posixwin32
  • 例外,选项dwarfsjlj
  • 构建修订版,选项012

我在之前的安装中选择的值是 win32seh1(显然,从那时起选项已经改变,但我不知道是什么)。

每个选项的优缺点是什么,尤其是线程模型和异常处理,哪个版本是“最好的”?

我使用x86_64-win32-seh-rev1遇到的具体问题是:

  • 不支持std::threadstd::condition_variable
  • 调试时(使用 Code::Blocks 作为 IDE),如果抛出异常,它不会跳转到异常处理程序;选择 Next Line 3 次什么都不做,然后中止运行。

我可以处理调试问题,但如果有工作的 C++11 线程会非常好。

【问题讨论】:

  • 更新。注意到std::thread 等隐藏在_GLIBCXX_HAS_GTHREADS 后面,这不是我安装的mingw-w64 定义的
  • 不要自己定义 - 如果你链接 pthread 的,它就会启用。
  • 对于其他阅读本文的人:当使用win32 线程时,this project 启用 C++11 线程、互斥锁和 condition_variable,它似乎可以工作!

标签: windows g++ mingw-w64


【解决方案1】:

例外情况

请参阅this answer for all three models (dwarf, sjlj and seh)

线程

您可以决定要使用哪种线程:POSIX 线程或 Windows API 线程。 posix线程具有可移植性的优点;您可以在其他 posix 平台(例如 linux)上使用您的代码而无需修改。 win32 线程 API 仅适用于 Windows。如果你 100% 使用 Windows 并且喜欢它的 api,那也没问题。

如果您使用新的 C++ 功能,例如 std::thread,则影响不太明显,因为您已经拥有用于线程的标准 api。我不确定如果你不直接使用posix-/win32线程api是否真的有很大的不同(也许std::thread原生句柄?)

另见:mingw-w64 threads: posix vs win32

构建版本

我猜这只是另一个版本号,因为 Mingw(-w64) 遵循 GCC 版本(4.8.x、4.9.x 等)。如果您不需要特定版本,则应使用最新版本。

线程问题

如果抛出的异常是:

terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted

然后只需 链接 pthreads - 问题就解决了。


推荐

如果您没有理由使用特定选项;我个人的建议:

posix - dwarf - 2
  • Posix 启用 C++11 <thread><mutex><future>
  • 矮人更快
  • 2 因为它是最新版本

【讨论】:

  • 感谢您的详细回答。您链接到的关于异常处理的问题表明dwarf 在 64 位中不起作用(我的目标是 64 位 Windows)。自从写了那个答案后,它有没有得到改进?
  • 关于线程,我打算使用C++11线程;并且不直接使用 pthread API。我想我应该在 pthreads 选项之间进行某种性能测试;以及带有meganz addon 的win32 选项。
  • 线程: 使用 C++11 线程 api,您甚至可以稍后更改 - 底层模型被很好地抽象。所以最后这对我来说似乎是一个性能/个人偏好的决定——可以随时切换!顺便提一句。如果你能分享你的结果会很酷。
  • 好的。我现在看到,一旦您选择了目标类型,mingw-w64 安装程序就会更改其选项;所以如果选择了x86_64,那么仅有的两个选项是sjljseh。所以看起来它是在慢速和调试器失败之间进行选择。也许我会发布一个关于 seh 调试问题的新问题。
  • “Posix 线程更便携”:libgcc 内部线程 API 对可移植性完全没有影响:您也可以使用 win32 线程 GCC 调用 pthreads 函数。为了正确起见,我修改了您的答案。
猜你喜欢
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2021-10-23
  • 2021-05-28
  • 1970-01-01
  • 2016-11-15
  • 2020-05-29
相关资源
最近更新 更多