当前位置: 首页 > news >正文

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)。

五、总结对比

特性UCRTMSVC
全称Universal C RuntimeMicrosoft Visual C++
类型C 标准库实现C/C++ 编译器工具链
是否编译器
是否运行时库
是否系统组件✅(从 Win10 开始)❌(需安装)
主要 DLLucrtbase.dllvcruntime140.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 是“基础库”。

http://www.dtcms.com/a/231713.html

相关文章:

  • WES7系统深度定制全流程详解(从界面剥离到工业部署)
  • Java 2D 图形变换方法
  • Cocos creator游戏开发面试题
  • 分享一颗PD协议芯片(取电sink芯片),ECP5701输入电压3V-28V
  • COMSOL与MATLAB联合仿真人工智能的电学层析成像系统
  • Visual Studio C++ 调试日志与异常定位指南
  • 一则systemctl service诡异问题
  • PWM 相关知识整理
  • 【趣味Html】第11课:动态闪烁发光粒子五角星
  • #Java篇:学习node后端之sql常用操作
  • 解决docker运行zentao 报错:ln: failed to create symbolic link ‘/opt/zbox/tmp/mysq
  • 双栈共享一个栈空间
  • 小黑黑日常积累:dataclass的简单使用
  • 高效使用AI大模型:测试工程师提示词编写框架
  • [Java 基础]面向对象-继承
  • 【el-progress】element UI 进度条组件
  • 时间序列预测:LSTM与Prophet对比实验
  • Spring AI Tool Calling
  • 深入解析Java17核心新特性(密封类、模式匹配增强、文本块)
  • C++ 变量三
  • 前端八股之JS的原型链
  • 项目实战——C语言扫雷游戏
  • MySQL ACID 面试深度解析:原理、实现与面试实战
  • SARIMA时间序列分析:三大模型对比
  • Python网页数据抓取常用的库及方法介绍
  • SpringBoot+Mybatisplus配置多数据源(超级简单!!!!)
  • C# 一个解决方案放一个dll项目,一个dll测试项目 ,调试dll项目的源码
  • NLP学习路线图(二十三):长短期记忆网络(LSTM)
  • BERT vs Rasa 如何选择 Hugging Face 与 Rasa 的区别 模型和智能体的区别
  • 祝贺XC3576H通过银河麒麟桌面操作系统的兼容性测试,取得麒麟软件互认证证书