UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)

UCRTMSVC 是与 Windows 平台上 C/C++ 开发相关的两个重要概念,它们都属于 Microsoft 的开发工具链的一部分。下面详细解释它们的含义、区别以及用途。


一、UCRT(Universal C Runtime)

1. 含义:

UCRT(Universal C Runtime) 是微软提供的 C 标准库实现,它是 Windows 操作系统的一部分。从 Windows 10 开始,UCRT 被集成进操作系统中,并通过 Windows Update 进行更新。

2. 特点:

  • UCRT 提供了标准 C 库函数,如 printf, malloc, fopen 等。
  • 它是跨平台兼容的,支持多种架构(x86, x64, ARM)和多个 Windows 版本。
  • 从 Visual Studio 2015 开始,所有基于 MSVC 编译器构建的应用程序默认链接到 UCRT。
  • UCRT 是"系统级"的运行时库,作为 Windows 的一部分进行维护。

3. 位置:

  • 在 Windows 系统中,UCRT 的 DLL 文件通常为:ucrtbase.dll
  • 静态库文件位于 Visual Studio 或 Windows SDK 的安装目录下。

二、MSVC(Microsoft Visual C++)

1. 含义:

MSVC(Microsoft Visual C++) 是微软的 C/C++ 编译器工具链,包含编译器 (cl.exe)、链接器 (link.exe)、调试器等工具。

2. 功能:

  • 将 C/C++ 源代码编译成机器码。
  • 支持现代 C++ 标准(如 C++17、C++20)。
  • 提供 C++ 标准库的实现(包括 STL:vector、map、string 等容器和算法)。
  • 可以选择使用静态或动态链接的运行时库(MT/MTd、MD/MDd)。

3. 与 UCRT 的关系:

  • MSVC 使用 UCRT 作为其 C 标准库的底层实现。
  • 即:MSVC 的 C++ 标准库依赖于 UCRT 中的 C 函数支持。
  • 所以,MSVC + UCRT = Windows 上完整的 C/C++ 开发环境。

三、运行时库选项(Runtime Library)

在 Visual Studio 中,项目属性里可以设置运行时库:

选项 含义
/MT 使用多线程静态 CRT(不推荐用于新项目)
/MTd 调试版的静态 CRT
/MD 使用多线程动态 CRT(默认,使用 UCRT 的 DLL)
/MDd 调试版的动态 CRT

推荐使用 /MD,这样程序会使用系统中的 UCRT DLL(例如 ucrtbase.dll),便于统一版本和节省部署体积。


四、VC++ 运行库(Visual C++ Redistributable)

当你在一台没有安装 Visual Studio 的电脑上运行一个使用 MSVC 编译的程序时,可能需要安装 VC++ 运行库(VC Redist)

  • 它包含了 MSVC 的 C++ 运行时库(如 vcruntime140.dll, msvcp140.dll)以及 UCRT 的 DLL(如 ucrtbase.dll)。
  • 不同版本的 VC Redist 对应不同的 MSVC 工具集版本(如 VS2015、VS2019、VS2022)。

五、总结对比

特性 UCRT MSVC
全称 Universal C Runtime Microsoft Visual C++
类型 C 标准库实现 C/C++ 编译器工具链
是否编译器
是否运行时库
是否系统组件 ✅(从 Win10 开始) ❌(需安装)
主要 DLL ucrtbase.dll vcruntime140.dll, msvcp140.dll
是否提供 C++ 支持 ✅(含 STL)
是否可单独安装 ✅(通过 VC Redist) ✅(通过 VS 或 Build Tools)

六、常见问题解答

Q: 我的程序提示缺少 ucrtbase.dll

A: 说明目标系统缺少 VC++ 运行库,请安装最新版 VC++ Redistributable

Q: UCRT 是不是就是 CRT?

A: 是的,UCRT 是 Microsoft 新一代的 CRT(C Runtime)。旧版 CRT 是 msvcrt.dll,现在已被 UCRT 替代。

Q: UCRT 和 MSVC 是不是必须一起用?

A: 基本上是的。MSVC 默认使用 UCRT 作为其 C 标准库实现。你可以理解为:MSVC 是"大脑",UCRT 是"基础库"。

相关推荐
wdfk_prog几秒前
RT-Thread Kconfig 配置明明是 y,为什么 rtconfig.h 就是不生成?一次 `_PATH` 后缀踩坑复盘
c语言
是隼人11 分钟前
buuctf-pwn jarvisoj_level5(64位ret2libc)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
蛋先生DX27 分钟前
内存安全翻车现场的罪魁祸首,根源就在这三步里?
c++·后端·编程语言
小七在进步35 分钟前
C++入门(1)
java·jvm·c++
晴天的雨.99237 分钟前
[C++算法]快乐数
数据结构·c++·算法
影视飓风TIM43 分钟前
C++11 核心新特性完整梳理
数据结构·c++·算法
艾莉丝努力练剑44 分钟前
【AI大模型接入SDK】Ollama本地大语言模型部署
c++·人工智能·语言模型·自然语言处理·面试
晴天的雨.99244 分钟前
[C++]算法双指针 复写0
数据结构·c++·算法
霸道流氓气质1 小时前
MyBatis 与 SQL 层面关键技术详解
windows·sql·mybatis
Suxing91 小时前
C语言基础分享:C语言文件操作:从“写日记”到“拍电影”的存盘指南
c语言·开发语言