使用 MSYS2/MINGW-64 缺少 POSIX 和 std 符号

Posted

技术标签:

【中文标题】使用 MSYS2/MINGW-64 缺少 POSIX 和 std 符号【英文标题】:Missing POSIX and std symbols using MSYS2/MINGW-64 【发布时间】:2021-11-05 08:08:19 【问题描述】:

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

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

    on_exit() O_SYNC(与open()一起使用) sync() std::at_quick_exit()

我并不惊讶 1. 因为它不便携。

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

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

【问题讨论】:

On_exit 可以是这样的快速评论,也可以是根据细节自行回答的问题。 Windows 有一种恼人的倾向,即在 POSIX 内容前加上下划线。对于on_exit,他们有点移动它并得到了_onexit。但这仍然有点因为on_exit 不是POSIX。 atexit 是 POSIX。但是这些功能都没有真正匹配 1:1,所以请查阅文档。 @user4581301 知道 MSYS2 是否可能以某种奇怪的方式提供它们吗? 我很确定你对 4 不走运。大多数情况下对 2 都不走运。你将不得不做很多重写。我会专门问一个关于这个的问题。 3 _flushall 可能会满足您的需求。 Consult the documentation 确保。 【参考方案1】:

我认为 MinGW 从未声称完全兼容 POSIX,因此缺少O_SYNCsync() 是意料之中的。

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

根据this question 下的cmets 判断,at_quick_exit(和quick_exit 本身)不是由msvcrt.dll(MINGW64 使用的旧Microsoft C 运行时)提供的。您可以切换到 UCRT64 MSYS2 environment,它使用更现代的 C 运行时 (ucrtbase.dll),具有这些功能。

【讨论】:

好吧,POSIX 兼容性是他们在网站某处写的。但是,经过更多阅读后,您似乎是对的。他们在此页面上将其称为“大部分符合 POSIX 标准”:msys2.org/wiki/MSYS2-introduction @Silicomancer 我认为他们在谈论外壳、命令行实用程序、明显的文件系统层次结构等,而不是编译器本身。他们还提到他们有一个 Cygwin 叉子(并且 Cygwin 努力模仿 POSIX),但是你没有使用它(那将是 MSYS 环境),我会避免它。 好的,我试试UCRT64环境。您是否知道 UCRT64 是否提供与 MINGW64 相同的软件包,或者是否会发生 UCRT64 中缺少某些内容(例如预构建的 Qt 和预配置的 Qt Creator)? @Silicomancer 检查软件包列表以确定。还要记住,在 UCRT64 上编译的二进制文件不能在 Win 7 上运行(我认为运行时需要单独安装)。 切换到 UCRT64 解决了 std::at_quick_exit 问题。 Appart 从我使用 _commit() 代替 O_SYNC,std::atexit 代替 on_exit() (但不使用退出代码)。

以上是关于使用 MSYS2/MINGW-64 缺少 POSIX 和 std 符号的主要内容,如果未能解决你的问题,请参考以下文章

MSYS2/MinGW64 中的 ICU 58 未定义参考

MSYS2/MinGW-w64安装

windows安装msys2 mingw64

如何将使用sysioctl.h的代码移植到MinGW gcc中?

MSYS2 - 安装 gcc 或工具链?

在 VS 上开如何发使用 Mingw64 的 DLL