UCRT
和 MSVC
是与 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 是“基础库”。