msvcrt、ucrt 和 vcruntime 库之间的差异

fon*_*mon 29 crt msvcrt

有人可以解释一下它们之间的区别吗?互联网查询让我很困惑。

我用的是VS2019。

小智 48

MSVCRT 与 UCRT 这是 Microsoft Windows 上 C 标准库的两个变体。

MSVCRT(Microsoft Visual C++ Runtime)默认在所有 Microsoft Windows 版本上可用,但由于向后兼容性问题一直停留在过去,不兼容 C99 并且缺少一些功能。

  • 它不兼容 C99,例如 printf() 函数系列,但是......
  • mingw-w64 提供了替换功能,使东西在很多情况下兼容 C99
  • 它不支持 UTF-8 区域设置
  • 与 MSVCRT 链接的二进制文件不应与 UCRT 链接的二进制文件混合,因为内部结构和数据类型不同。相同的规则适用于 MSVC 编译的二进制文件,因为 MSVC 默认情况下使用 UCRT(如果未更改)。
  • 在每个 Microsoft Windows 版本上开箱即用。

UCRT(通用 C 运行时)是一个较新的版本,Microsoft Visual Studio 也默认使用它。它的工作和行为应该就像代码是用 MSVC 编译的一样。

  • 在构建时和运行时与 MSVC 具有更好的兼容性。
  • 默认情况下,它仅在 Windows 10 上提供,对于旧版本,您必须自己提供它或取决于安装它的用户。

信用: https: //www.msys2.org/docs/environments/

  • 这是一个很好的答案,但它没有解释问题所在的“ucrt”和“vcruntime”之间的关系。答案是,Microsoft 将其 CRT 分为两部分,一部分特定于其编译器(“vcruntime”),另一部分对所有编译器通用(“ucrt”)。因此,如果您使用非 Microsoft 编译器(如 Clang 或 GCC),您仍然使用 `ucrt`,但不使用 `vcruntime`;`vcruntime` 应该仅由 Microsoft 编译器使用。来源:https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-170 (22认同)