首页 > 解决方案 > 使用 MSYS2/MINGW-64 缺少 POSIX 和 std 符号

问题描述

我试图将一些 C/C++ 代码从 Linux 移植到 Windows。在 Linux 上,我使用 GCC-10 进行构建,在 Windows 上,我尝试使用 MSYS2/MINGW-64。我以前从未使用过 MSYS2,而且我几乎没有将 Linux/POSIX 代码移植到 Windows 的经验。

大多数(Qt)代码都是可移植的,所以我只在几行代码中遇到了不平凡的问题。结果发现缺少以下符号:

  1. on_exit()
  2. O_SYNC(与 一起使用open()
  3. sync()
  4. std::at_quick_exit()

我对 1. 并不感到惊讶,因为它不是便携式的。

但是 2. 和 3. 是 POSIX 符号,而 4. 是 C++11 标准库的一部分。由于 MSYS2 文档说它与 POSIX 和 GCC 兼容,我本来希望定义这些符号。

为什么这些符号不见了?有没有办法替换缺少的功能(可能使用对 Windows API 的调用)?

标签: c++posixportingmingw-w64msys2

解决方案


我认为 MinGW 从未声称完全兼容 POSIX,因此缺乏O_SYNC并且sync()是可以预料的。

on_exit有一个标准的替代品std::atexit

从这个问题下的评论来看,at_quick_exit(以及quick_exit它本身)不是由msvcrt.dll(MINGW64 使用的旧 Microsoft C 运行时)提供的。您可以切换到UCRT64 MSYS2 环境ucrtbase.dll,它使用具有这些功能的更现代的 C 运行时 ( )。


推荐阅读