MingGW Posix VS Win32 - 明瓜娃的毒因

1,872 阅读4分钟

MinGW-posix和win32纠缠的瓜娃子

官方首席佛偈(SourceForge)的官网下载页

MinGW-posix和win32纠缠的瓜娃子

法克油啊,让我一个小白情何以堪。

盘TA

wiki posix

  • wiki中文-UNIX API标准

Posix-Portable Operating System Interface可移植操作系统接口

wiki win32 暂且认定TA为win32API标准

Windows API

他俩有啥纠葛呢

  • 我来问问Google

posix win32 google results

good job 果然天下文章一大抄,我爸说的没错 No fuck u any more

  • 看看写的啥

我他娘的在win下装明瓜娃64的时候有俩选项,win32和posix线程。win32线程和皮线程的差异我还是知道的,蛋疼的是这里的选项是个啥(心里话他娘的不会安装旁边给个hint啊) 让我瑟瑟发抖的是,要是我选posix,鬼知道会不会让我蛋疼的调用不了WINAPI,比如新增线程

StackOverflow问答posix和win32

我也去抄一抄

读的有点膈应的翻译: 我正在安装 mingw-w64 on Windows,有两个选项: win32线程和posix线程。 我知道win32线程和pthreads之间的区别,但是我不明白这两个选项之间的区别。 我怀疑如果我选择了posix线程,它将阻止我调用像CreateThread这样的WinAPI函数。 似乎这个选项指定了哪个程序或者库将使用哪个线程 API,但通过什么? 由 GCC,libstdc++或者其他事物? 我发现:什么区别thread_posixs和 thread_win32 gcc Windows 港?

解答如下:

简而言之,对于这个版本的mingw,threads-posix发行版将使用 posix API并允许使用 std:: thread,threads-win32将使用 win32api,并禁用标准的std::thread 部分。 好的,如果我选择win32线程,那么 std::thread 将不可用,但是win32线程仍将被使用。 但是用什么?

  • gcc运行时( 特殊的异常处理)的部分依赖于正在使用的线程模型。 因此,如果你使用的是使用posix线程构建的运行时版本,但决定在你自己的代码中使用 win32 api创建线程,那么你可能会遇到一些问题。 即使你正在使用运行时的win32线程版本,你可能也不应该直接调用 win32 api 。 引用来自 MinGW常见问题解答:
  • 由于MinGW使用了 Windows 附带的标准Microsoft运行时库,所以你应该小心并使用正确的函数来生成一个新的线程。 CreateThread 函数将不会正确地为运行时库设置堆栈。 你应该使用 _beginthreadex,它是( 几乎几乎) 完全兼容 CreateThread 。 GCC附带了一个编译器运行时库( 宋体),它使用( 其中之一) 提供了一个用于在它的支持的语言中实现多线程相关功能的。 最相关的例子是 C++11 libstdc++ ,,, gcc时没有一个完整的实现了其内部win32线程模型。 MinGW-w64提供了 winpthreads ( Win32多线程API之上的一个pthreads实现),GCC可以链接它来启用所有的奇妙特性。
  • 我必须强调这里选项不允许你编写任何你想要的代码( 对于你可以在代码中调用的API,它有绝对的无影响) 。 它只反映了 (libgcc/libstdc++/...) 库的使用了哪些运行时。 由 @James 引用的警告与gcc线程模型的内部无关,而是与microsoft实现的CRT有关。

总结:

posix: 启用 c++11/c11多线程功能。 使depend依赖于 libwinpthreads,这样即使你不直接调用 API,你将分发 winpthreads 。 使用应用程序分发一个DLL没有什么问题。 win32: 没有C++11多线程功能。 对任何调用 Win32 api或者 pthreads api的用户代码都不影响。 你可以同时使用两个。

原作者:rubenvb

ask.helplib.com/windows/pos…

大结局

posix和win32对我们日常开发没啥影响,我看谁爽选哪个就好了。

--

另外调试选项sjlj和seh的你也可以用这个套路自己去扒一扒,大概就是调试性能和report方式啥的

吐槽sourceforge写了洋洋洒洒的wiki咋就不写这俩呢,ε=(´ο`*)))唉

如果你能用在线的installer就直接用,但我试了一下绿条条根本就不跑,选择一下自己下包安装啦。