mingw-w64安装程序中选项的含义

62
在MinGW-W64在线安装程序中,有几个可以选择的字段。但我找不到任何文档,而我猜测也没有得到我想要的行为。
显然,这个项目已经投入了很多工作,所以缺乏基本文档似乎是一种遗憾。
"版本"和"架构"字段是不言自明的,但我对其他字段有困扰(当前安装程序的值如下):
- 线程,选项posix和win32 - 异常,选项dwarf和sjlj - 构建修订版,选项0、1、2。
我在以前的安装中选择的值是 win32、seh 和 1 (显然选项从那时起已经改变,但我对于每个选项代表什么毫无头绪)。
每个选项的优缺点是什么,特别是线程模型和异常处理,哪个版本是"最佳"的?
使用 x86_64-win32-seh-rev1 时我遇到的具体问题是:
- 不支持 std :: thread 和 std :: condition_variable - 调试时(使用 Code::Blocks 作为 IDE),如果抛出异常,它不会跳转到异常处理程序;选择下一行三次后什么都不做,然后中止运行。
我可以应付调试问题,但真的希望能够使用 C++11 的线程。

1
更新。注意到std::thread等被隐藏在_GLIBCXX_HAS_GTHREADS后面,而我的mingw-w64安装中没有定义它。 - M.M
不要自己定义它 - 如果链接pthread,它就会被启用。 - ollo
1
对于其他读者:当使用win32线程时,这个项目可以启用C++11线程、互斥锁和条件变量,看起来很有效! - M.M
1个回答

37

异常

请参考这个回答,了解三种模型(dwarf, sjlj和seh)的区别

线程

您可以决定使用哪种类型的线程:POSIX线程或Windows API线程。POSIX线程具有可移植性的优点;您可以在其他POSIX平台(如Linux)上使用您的代码而不需要进行修改。win32线程API仅适用于Windows。如果您完全使用Windows并且喜欢其API,那么没有问题。

如果您使用新的C++功能,例如std::thread,则影响较小,因为您已经拥有了用于线程的标准API。如果您不直接使用posix/win32线程API(也许可以使用std::thread原生句柄?),我不确定是否真的有很大的区别。

还可以参见:mingw-w64线程: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>可用。
  • dwarf更快。
  • 2是最新版本。

2
感谢您提供详细的答案。您所链接的关于异常处理的问题指出,dwarf 在 64 位系统上无法正常工作(而我正在针对 64 位 Windows 进行开发)。自那篇回答发布以来,它有没有得到改进呢? - M.M
关于线程,我打算使用C++11线程;而不是直接使用pthread API。我想我应该在pthread选项和win32选项之间进行某种性能测试,使用meganz addon - M.M
1
异常:我认为这更多是一个兼容性问题。如果您的程序使用dwarf而windows库(例如VC++构建)引发异常,则会通过您的dwarf异常代码进行传播。如果您使用许多不了解dwarf但可能会抛出异常的库,请使用sjlj。如果您只有不会抛出异常或者是darf感知的库,那应该能够正常工作-在我看来。 - ollo
3
好的。我现在明白了,mingw-w64安装程序会在选择目标类型后更改选项;因此,如果选择了x86_64,那么只有sjljseh两个选项。所以看起来这是在慢速和调试器失败之间做出选择。也许我会发一个新问题,关于使用seh进行调试的问题。 - M.M
1
"Posix线程更具可移植性": libgcc内部线程API对可移植性没有任何影响:您可以使用win32线程GCC调用pthread函数。我修改了您的答案以确保正确性。 - rubenvb
显示剩余2条评论

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