深入解析VC Runtime:什么是vcruntimeXXX.dll和api-ms-win-crt-runtime-X-X-X.dll?

在发布windows软件后,本地运行好好的,但用户那经常会遇到这类报错:
在这里插入图片描述
又或者在这里插入图片描述
到底是什么原因呢?

背景知识

要弄懂这个问题,首先要先了解 Microsoft Visual C++ 运行时库 (CRT) 。
Microsoft Visual C++ 运行时库(CRT)是一套由 Microsoft 提供的标准库,包含了一系列用于执行常见操作的函数和数据结构,如输入输出处理、字符串操作、内存分配和数学计算等。这些库提供了基础的程序运行环境,使用Visual C++开发的程序都需要他们。

如果程序所需的运行时库在用户电脑上找不到,而且分发软件时没有打包相应的运行时库,那么用户可能就会弹出前面的报错提示。

VCRuntime

在Visual Studio 2015 之前,CRT 主要指VCRuntime,VCRuntime可以分为几个不同的部分:

  1. C 运行时库: 这是 CRT 的核心部分,提供了 C 语言标准库所定义的功能,如 printf()malloc()fopen() 等。

  2. C++ 标准库: 包含 C++ 标准库的实现,涵盖了如 STL 容器(如 vectormap 等)、算法、字符串类(如 std::string)以及其他标准功能。

  3. C++/CLI 运行时库: 用于支持 C++/CLI 语言的特定功能,这是一个为 .NET 框架设计的 C++ 语言变种。

  4. 并发运行时: 提供了并发和并行编程模型的支持,如任务并行库(TPL)。

  5. 安全增强的 CRT: 为了防止缓冲区溢出等安全问题,Microsoft 提供了一些增加了安全检查的函数版本,如 strcpy_s() 代替 strcpy()

  6. CRT 的调试版本: 包含了额外的调试信息和检查功能,帮助开发者在开发阶段发现和修复错误。

Visual C++ 运行时库可以以两种方式与应用程序链接:

  • 静态链接(/MT 或 /MTd 编译器选项): 运行时库的代码会被编译到应用程序的二进制文件中。这样的应用程序不需要额外的 DLL 文件就可以运行,但会增大最终的可执行文件大小,并且如果运行时库更新,程序也需要重新编译分发。

  • 动态链接(/MD 或 /MDd 编译器选项): 应用程序在运行时依赖外部的 DLL 文件,如 msvcrXXX.dllmsvcpXXX.dllvcruntimeXXX.dll 等。动态链接的好处是减小了可执行文件的大小,并且当运行时库更新时,通常不需要重新编译程序。

Universal CRT (UCRT) 的出现

从 Visual Studio 2015 开始,CRT 升级成了 Universal CRT (UCRT) 。UCRT 是操作系统级别的组件,作为 Windows 的一部分,提供跨版本的 C 运行时支持。

MSVCRT(Microsoft Visual C++ 运行时)被淘汰的原因主要有:

  1. 向后兼容性问题,它未能跟上时代,不兼容C99标准,并且缺少一些特性。例如,它不兼容C99标准中的printf()函数族
  2. 它不支持UTF-8本地化设置,因此跨平台性很差
  3. 与MSVCRT链接的二进制文件不应该与UCRT链接的二进制文件混合使用,因为它们内部结构和数据类型有所不同。对于MSVC编译的二进制文件也适用相同规则,因为MSVC默认使用UCRT(除非进行更改)。

据说UCRT是微软用C++重新实现了之前用C写的vcruntime了,微软还顺便吐槽了一下C语言,同时表扬C++的安全性和便利性。这主要是因为 C++ 提供了更好的类型安全、抽象和资源管理(例如 RAII,即资源获取即初始化)等特性,相对于 C,它可以帮助开发者更容易地编写出更安全和更易于维护的代码。

另外,微软的目标是希望 UCRT 成为所有 Windows 应用程序的共同基础,UCRT 作为 Windows 的一部分,通过 Windows Update 分发,确保了所有系统上的运行时行为的一致性和最新性。
更多信息,可以参考:upgrade-your-code-to-the-universal-crt

api-ms-win-crt-runtime-XXX.dll就是Universal CRT (UCRT) 的组件之一。

由于Visual C++ 2015(版本14.0)之后开始,旧淘汰了老的一套msvcpXXX.dll的二进制模式了,因此,在电脑中是找不到vcruntime140.dll版本以后的运行时了,例如msvcp141.dll是不存在的:
在这里插入图片描述
而msvcp100.dll、msvcp110.dll、msvcp120.dll等则广泛存在:
在这里插入图片描述

如何找到Visual C++ Redistributable Package对应的二进制

随着不同版本的 Visual Studio 的发布,Microsoft 也会随之更新这些运行时库,以支持新的 C 和 C++ 标准特性、提高性能和安全性。因此,开发者需要确保他们的程序与用户系统上安装的运行时库相兼容。这可以通过分发对应版本的 Visual C++ Redistributable Package 来实现。

例如,VCRuntime 的Redistributable Package,可以根据Microsoft Visual Studio版本,找到对应目录,根据架构找到子目录,例如Microsoft Visual Studio 14.0的x86架构的VC CRT目录如下:
在这里插入图片描述
如果使用动态链接运行时,那么则需要把这些文件也一并打包分发。
如果想深入了解动态链接运行时库和静态链接运行时库的技术细节,可以参考文章:《运行时库链接方式实践指南》

类似地,对于URCT,以10.0.19041SDK的x86为例,目录如下:
在这里插入图片描述

展开说说VCRuntime 各个文件的作用:

以 Microsoft Visual Studio 2015(代号为 Visual Studio 14.0)的 C++ 运行时库组件文件为例,每个文件的功能如下:

concrt140.dll

  • 名称: Concurrency Runtime
  • 功能: 提供支持并发编程模型的功能。这包括任务并行库、并行算法、同步数据结构等。它是用于开发利用多核处理器性能的应用程序的重要组件。

msvcp140.dll

  • 名称: Microsoft C++ Runtime Library
  • 功能: 包含 C++ 标准库的函数和类,例如标准输入输出流、字符串操作、数学函数等。这是编写 C++ 程序时常用到的运行时库,用于动态链接。

vccorlib140.dll

  • 名称: Visual C++ C++/CX Runtime Library
  • 功能: 为 C++/CX (Component Extensions) 提供支持,这是 Microsoft 为简化 Windows 运行时组件编程而创建的一套语言扩展。这个库主要用于开发 Windows Store 应用程序。

vcruntime140.dll

  • 名称: Visual C++ Runtime Library
  • 功能: 包含 C 运行时库的核心组件,如内存分配、字符串操作和数学运算等。它也包含了基本的运行时错误处理和其他关键的函数。这个 DLL 专注于 C 语言层面的运行时支持。

展开说说Universal CRT (UCRT)各个文件的作用

从VCRuntime发展到UCRT,二进制按功能划分得更细了,完整的19041 SDK的UCRT有43个文件,因此,我们根据文件体积,选取Top20的UCRT文件来说明各个模块的功能:

  1. ucrtbase.dll

    • 提供了 C 运行时库的基础部分,包括标准的输入/输出操作、字符串处理、数学计算等。
  2. api-ms-win-crt-private-l1-1-0.dll

    • 提供了一些内部使用的或者不公开的 C 运行时库功能。
  3. api-ms-win-crt-math-l1-1-0.dll

    • 包含了 C 运行时库中的数学函数,如 sin, cos, sqrt 等。
  4. api-ms-win-crt-multibyte-l1-1-0.dll

    • 提供了用于多字节字符集(MBCS)和宽字符集(Unicode)之间转换的函数。
  5. api-ms-win-crt-string-l1-1-0.dll

    • 包含了 C 运行时库中处理字符串的函数,如 strcpy, strlen 等。
  6. api-ms-win-crt-stdio-l1-1-0.dll

    • 提供了标准输入输出相关的函数,如 printf, scanf, fopen 等。
  7. api-ms-win-crt-runtime-l1-1-0.dll

    • 包含了 C 运行时库中与程序运行时环境相关的函数,如 abort, exit, 环境变量处理等。
  8. api-ms-win-crt-convert-l1-1-0.dll

    • 提供了类型转换相关的函数,如数字到字符串的转换等。
  9. api-ms-win-core-file-l1-1-0.dll

    • 提供了文件操作相关的函数,如 CreateFile, ReadFile 等。
  10. api-ms-win-crt-time-l1-1-0.dll

    • 包含了 C 运行时库中处理日期和时间的函数。
  11. api-ms-win-core-processthreads-l1-1-0.dll

    • 提供了进程和线程管理相关的函数。
  12. api-ms-win-core-localization-l1-2-0.dll

    • 提供了本地化和国际化支持相关的函数。
  13. api-ms-win-crt-filesystem-l1-1-0.dll

    • 包含了 C 运行时库中处理文件系统相关操作的函数,如路径操作等。
  14. api-ms-win-core-synch-l1-1-0.dll

    • 提供了同步对象(如互斥锁、事件等)的操作函数。
  15. api-ms-win-crt-process-l1-1-0.dll

    • 包含了与进程操作相关的函数。
  16. api-ms-win-crt-heap-l1-1-0.dll

    • 提供了堆内存管理相关的函数,如 malloc, free 等。
  17. api-ms-win-crt-conio-l1-1-0.dll

    • 包含了控制台输入输出相关的函数,如 _getch, _cprintf 等。
  18. api-ms-win-core-sysinfo-l1-1-0.dll

    • 提供了系统信息查询相关的函数。
  19. api-ms-win-core-processenvironment-l1-1-0.dll

    • 包含了进程环境相关的函数,如环境变量的获取和设置。
  20. api-ms-win-core-libraryloader-l1-1-0.dll

    • 提供了 DLL 加载和卸载相关的函数。

VCRuntime和UCRT的二进制体积对比:

VCRuntime的x86架构的二进制体积992KB
在这里插入图片描述
而win10的19041SDK相应的x86的UCRT二进制体积:1.68MB
在这里插入图片描述
二者对比:

36% 64% CRT VS UCRT dlls 体积 CRT [985] UCRT [1720]

由此可见,UCRT体积更大,但是由于模块划分得更细,开发者可以只打包所需的二进制库,提高了二进制使用率。

结语

总之,运行时库的 DLL 文件通常会随着安装 Visual Studio 或运行安装了 Visual Studio 开发的应用程序时被安装到系统中。如果应用程序使用动态链接库(DLL)而非静态链接库(LIB)版本的运行时库进行编译,则在运行时需要这些 DLL 文件。缺少这些文件可能会导致应用程序无法运行。

为了解决这个问题,微软建议打包并引导用户安装安装对应版本的 Visual C++ Redistributable ,就可以提供这些必需的运行时库文件。这种方式的优点是运行时库可以及时更新,并且每个软件都可以共享二进制,减少安装包体积,但这个缺点是用户体验不好,用户可能需要安装两次(第一次是软件本体,第二次是Visual C++ Redistributable)。国内大部分软件的最佳实践是在安装包中打包所依赖的运行时,这样虽然稍微增加了安装包体积,但是能彻底避免用户无法运行的问题,用户体验更好

对于一个项目,如果使用多个版本的VC工具集编译,则需要打包多个VC运行时,这一点也需要留意。
赶快去查一查自己的运行时二进制是不是已经把需要的二进制都打包完整了吧!

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
api-ms-win-crt-runtime-l1-1-0.dll是一个系统文件,它是系统安装程序MSL相关模块的一部分。当我们在电脑上安装软件或游戏时,有时可能会遇到api-ms-win-crt-runtime-l1-1-0.dll丢失、错误或找不到等情况,导致程序或游戏无法启动。 解决这个问题的方法是重新安装 api-ms-win-crt-runtime-l1-1-0.dll 文件。你可以通过安装vc2015或vc2017来获取该文件。安装这些软件的目的是为了确保系统中有相应的运行库文件,从而解决api-ms-win-crt-runtime-l1-1-0.dll丢失的问题。 当你安装好api-ms-win-crt-runtime-l1-1-0.dll文件后,你就可以重新打开你的软件或游戏了。如果还有其他的dll文件显示丢失、错误或找不到等情况,你可以在相应的网站上搜索并下载对应的dll文件进行安装。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [计算机中丢失api-ms-win-crt-runtime-l1-1-0.dll的疑难杂症解决方法](https://blog.csdn.net/hfhbutn/article/details/88625571)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [计算机中api-ms-win-crt-runtime-l1-1-0.dll丢失怎么解决](https://blog.csdn.net/qdx698767896/article/details/118025791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值