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 是"基础库"。

相关推荐
xiaoshuaishuai88 小时前
C# 接入 OpenClaw
windows·visualstudio·c#
W23035765739 小时前
经典算法:最长上升子序列(LIS)深度解析 C++ 实现
开发语言·c++·算法
.Ashy.9 小时前
2026.4.11 蓝桥杯软件类C/C++ G组山东省赛 小记
c语言·c++·蓝桥杯
2401_892070989 小时前
链栈(链式栈) 超详细实现(C 语言 + 逐行精讲)
c语言·数据结构·链栈
minji...10 小时前
Linux 线程同步与互斥(三) 生产者消费者模型,基于阻塞队列的生产者消费者模型的代码实现
linux·运维·服务器·开发语言·网络·c++·算法
CoderCodingNo12 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
cmpxr_13 小时前
【C】局部变量和全局变量及同名情况
c语言·开发语言
hetao173383713 小时前
2026-04-09~12 hetao1733837 的刷题记录
c++·算法
6Hzlia13 小时前
【Hot 100 刷题计划】 LeetCode 136. 只出现一次的数字 | C++ 哈希表&异或基础解法
c++·算法·leetcode
汉克老师14 小时前
GESP2024年6月认证C++三级( 第二部分判断题(1-10))
c++·数组·位运算·补码·gesp三级·gesp3级