C/C++运行时库和UCRT系统通用运行时库总结及问题实例分享

目录

1、概述

2、不同版本的Visual Studio对应的运行时库说明

3、在Windbg10.0安装目录中获取UCRT通用运行时库

4、微软官网对UCRT通用运行时库的相关说明

5、使用Visual Studio 2017开发软件初期遇到的UCRT通用运行时库问题

6、如何查看软件依赖了哪些C/C++运行时库?

7、将软件从32位升级到64位后,要使用64位UCRT通用运行时库

8、发布软件时未打包C/C++运行时库的项目问题实例


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       大家在开发C++软件的过程中,会时不时遇到这样或那样的C/C++运行时库相关问题。今天结合多年的C++软件开发经验,给大家详细介绍一下C/C++运行时库以及以api-ms-win-开头的UCRT系统通用运行时库,并给出了项目问题分析实例,以供大家借鉴或参考。

1、概述

       使用Visual Studio开发的C++应用程序,在发布时需要将C/C++运行时库一起打包到安装包中,安装时将C/C++运行时库放置到exe主程序的安装目录中。C++应用程序调用的C/C++运行时函数(比如abort、system、strlen、strcpy等)以及C++标准库,都在C/C++运行时库中。C++应用程序依赖这些C/C++运行时库,启动时需要加载这些运行时库。

       为啥要带上C/C++运行时库呢?如果机器上安装了Visual Studio,在安装Visual Studio时会自动将对应版本的运行时库拷贝到系统目录C:\Windows\System32(在64位系统中,32位版本的运行时库会拷贝到C:\Windows\SysWOW64目录中)。如果机器上没有安装Visual Studio,系统目录中一般不会有这些C/C++运行时库,如果此时安装目录中也没有,则程序启动时会因为在系统中找不到这些库而启动失败。

2、不同版本的Visual Studio对应的运行时库说明

        我们代码中调用的很多C/C++基本库函数都位于C/C++运行时库中,比如abort、system、strlen、strcpy等运行时库函数。一般运行时库是以msvcr(C运行时库)或msvcp(C++运行时库)开头的。

       不同版本的Visual Studio携带的C/C++运行时库的名称也不一样,这些运行时库一般要打包到安装程序中,安装时要拷贝到exe主程序的安装目录中。

       对于不同版本的Visual Studio对应的运行时库版本,很多人可能分不清楚,会有疑惑,这里详细给大家介绍一下:(以d结尾的是Debug版本的运行时库)

1)VS2010对应的运行时库文件(对应100版本):msvcp100.dll(msvcp100d.dll)、msvcr100.dll(msvcr100d.dll);
2)VS2012对应的运行时库文件(对应110版本):msvcp110.dll(msvcp110d.dll)、msvcr110.dll(msvcr110d.dll);
3)VS2013对应的运行时库文件(对应120版本):msvcp120.dll(msvcp120d.dll)、msvcr120.dll(msvcr120d.dll);
4)VS2017对应的运行时库文件(对应140版本):msvcp140.dll(msvcp140d.dll)、vcruntime140.dll(vcruntime140d.dll)、u以及UCRT通用运行时库(ucrtbase.dll(ucrtbased.dll)+ 多个以api-ms-win-开头的dll库)。 (VS2017引入了两类新库vcruntime140.dll和UCRT,不再有msvcr140.dll库,只保留了msvcp140.dll库)

       在Visual Studio 2015之前的版本中,C/C++运行时库主要由msvcrXXX.dll和msvcpXXX.dll,其中XXX是对应Visual Studio版本对的数字,如上所示。 在Visual Studio 2015中,C/C++运行时库被分离重构,分离成msvcp、vcruntime和UCRT,在Visual Studio 2015及以后的版本中,均使用这种新的结构。

       UCRT,全称为The Universal CRT,Windows系统通用运行时库,主要由ucrtbase.dll以及api-ms-win-开头的多个dll库,如下所示:

3、在Windbg10.0安装目录中获取UCRT通用运行时库

       使用Visual Studio 2015及以上版本开发的C++应用程序,发布时都要带上这些通用运行时库。这些UCRT通用运行时库可以从Windows SDK中获取。比如可以从安装的Windbg10.0的安装目录中找到这些UCRT通用库,当时Windbg10.0就是使用Windows SDK安装的,所以安装目录中可以找到UCRT运行时库。比如我本机的安装目录:

C:\Program Files (x86)\Windows Kits\10\Redist\10.0.17763.0\ucrt\DLLs

在上述路径中可以找到,如下所示:(可以在Windbg安装目录中以api-ms-win为关键字搜索,找到具体的路径

可以将这些路径下的通用运行时库拷贝到项目中,发布版本时要将这些运行时库带上。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:(该精品技术专栏的订阅量已达到430多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2: 

C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战经验为基础,总结并讲解一些的C/C++基础与进阶内容,以图文并茂的方式对C++相关知识点进行详细地展开与剖析!专栏涉及了C/C++开发领域多个方面的内容,同时给出C/C++及网络方面的常见笔试面试题,并详细讲述Visual Studio常用调试手段与技巧!

专栏3: 

VC++常用功能开发汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

专栏将10多年C++开发实践中常用的功能,以高质量的代码展现出来,并对相关功能的实现细节进行了详细的说明。这些常用的代码,其质量与稳定性是有保证的,可以直接拿过去使用,可以有效地解决C++软件开发过程中遇到的问题。


4、微软官网对UCRT通用运行时库的相关说明

       微软官网也有介绍UCRT通用运行时库的相关介绍,直接在Microsoft Learn: Build skills that open doors in your career上搜索UCRT,会搜索到如下结果:

点击“将代码升级到通用 CRT”这一项,进入页面,其链接为:(此处提供英文版本的链接,如果要查看中文,可以在页面底部左下角的语言切换栏切换成中文)
Upgrade your code to the Universal CRTicon-default.png?t=N7T8https://learn.microsoft.com/en-us/cpp/porting/upgrade-your-code-to-the-universal-crt?view=msvc-170在该网页中可以看到如何获取UCRT运行时库,如下所示:

​5、使用Visual Studio 2017开发软件初期遇到的UCRT通用运行时库问题

        我们项目之前使用Visual Studio 2010开发的,后来因为使用了Visual Studio 2017编译的开源WebRTC库,将Visual Studio升级到了2017版本。最开始并不知道UCRT通用运行时库的存在,在发布版本时没有将这些以api-ms-win-开头的通用运行时库带上,导致在部分机器上启动程序时会报错:

​后来查看腾讯会议、WPS和企业微信等程序的安装目录中均有带上多个以api-ms-win-开头多个dll库:

​估计是这些库是个集合库,使用Visual Studio较高版本开发的C++应用程序在发布时都要打包带上。

       关于如何获取这些以“api-ms-win”开头的dll库,到网上搜索了一下,有人在微软的技术论坛中问过UCRT通用运行时库的问题,如下:

Missing API DLL API STUB Set for Windowsicon-default.png?t=N7T8https://social.technet.microsoft.com/Forums/windows/en-US/327da89c-9d1c-4dca-9371-9771eabc3df9/missing-api-dll-api-stub-set-for-windows?forum=win10itprogeneral评论区中有人回复,可以参照下面这篇文章中的说明
Introducing the Universal CRTicon-default.png?t=N7T8https://devblogs.microsoft.com/cppblog/introducing-the-universal-crt/其中下面一段话讲到了如何去获取the Universal CRT系统通用运行时库,如下所示:

于是这才知道,这些以api-ms-win-开头多个dll库叫做UCRT通用运行时库。

6、如何查看软件依赖了哪些C/C++运行时库?

       当前软件到底依赖了哪些C/C++运行时库,可以直接在开发着的机器上将软件运行起来,然后使用Process Exploer工具查看软件进程加载的dll库列表,就能看到了,比如:

​当然,也可以使用dumpbin工具将软件所有模块的依赖库打印出来,也能找到依赖哪些运行时库。具体如何使用dumpbin查看库依赖关系,可以查看我之前写的文章:

将dumpbin从Visual Studio中抠出来,并使用dumpbin查看exe和dll库的依赖关系icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/135483516       如果程序中使用了多个版本的Visual Studio编译的模块,则需要把这些Visual Studio版本对应的运行时库都带上的。比如有些模块是Visual Studio 2010编译出来的,则会依赖msvcr100.dll和msvcp100.dll;有些模块是Visual Studio 2017编译出来的,则会依赖msvcp140.dll和vcruntime140.dll等库。在发布版本时需要将这些依赖的dll库都带上。

       对于以api-ms-win-开头多个dll库UCRT通用运行时库,可以先到官网上搜索Windbg,然后通过Windows SDK去安装Windbg,然后在Windbg的安装路径中就能找到这些通用运行时库,比如我本机的安装目录C:\Program Files (x86)\Windows Kits\10\Redist\10.0.17763.0\ucrt\DLLs中可以找到,如下所示:(可以在Windbg安装目录中以api-ms-win为关键字搜索,找到具体的路径)

​7、将软件从32位升级到64位后,要使用64位UCRT通用运行时库

       最近将软件从32位升级到64位,要将打包的运行时库都换成64位的,比如msvcp140.dll、vcruntime140.dll等库路径,可以在开发者的机器上将64位软件运行起来,然后使用Process Explorer工具查看这些库的路径:

到路径中将dll库拷贝到项目中即可。

       但对于以api-ms-win-开头多个UCRT通用运行时库,因为包含了多个dll库,要将所有的dll库都拷贝上,不好使用Process Explorer工具查看,可以到Windbg安装路径中整体拷贝x64版本UCRT即可。比如我本机的安装目录:

C:\Program Files (x86)\Windows Kits\10\Redist\10.0.17763.0\ucrt\DLLs

可以在这个路径中找到,如下所示:(可以在Windbg安装目录中以api-ms-win为关键字搜索,找到具体的路径)

​该路径下有x86和x64两个版本,分别对应32位和64位,我们拷贝x64版本即可。

8、发布软件时未打包C/C++运行时库的项目问题实例

       某天同事在调试使用瑞芯微主控CPU芯片的嵌入式设备(嵌入式设备使用的是Android系统)时,需要在PC上使用瑞芯微提供的一个工具软件去远程配置图像质量参数,但这个工具启动时会报错,无法运行,如下所示:

​同事找到我,让我帮他们看看是怎么回事,看能否让这个工具尽快跑起来。经排查,瑞芯微提供的工具软件包没有将依赖的运行时库msvcr120.dll和msvcp120.dll一起带上,如下:

​正好同事的电脑上没有这两个库,所以启动报错。瑞芯微是做硬件芯片的,可能软件这块不专业,这点也可以理解。

       这个问题的详细排查过程,可以查看我之前写的文章:

使用Dependency Walker和Process Explorer排查瑞芯微工具软件RKPQTool.exe启动报错问题icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/135229025       另一个与C/C++运行时库相关的实例,可以查看我的文章:

使用Process Explorer和Dependency Walker排查程序启动时缺少ucrtbase.dll等运行时库以及报0xC000007B错误icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/135483683

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端雪花算法主键ID传到前端变了

Mybatis Plus 的主键策略: /*** id*/TableId(type IdType.ASSIGN_ID)private Long id; 这个主键策略会用雪花算法生成一个 19位的ID,比如 1791006670084734978 现象 后端生成的 id 是正常的,通过 swagger 文档此时获取到的 id 也和数据库中…

leetcode-盛水最多的容器-109

题目要求 思路 1.正常用双循环外循环i从0开始,内循环从height.size()-1开始去计算每一个值是可以的,但是因为数据量太大,会超时。 2.考虑到超时,需要优化一些,比如第一个选下标1,第二个选下标3和第一个选下…

Java 面试题日常练习

### 基础知识 1. **什么是 JVM?解释其架构。** - JVM(Java Virtual Machine)是 Java 程序的运行时环境。其架构包括类加载器子系统、运行时数据区(堆、栈、本地方法栈、PC 寄存器、方法区)、执行引擎和本地方法接口…

心识宇宙 x TapData:如何加速落地实时数仓,助力 AI 企业智慧决策

使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量代替 OGG、DSG 等同步工具,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

基于springboot实现华府便利店信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现华府便利店信息管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本华府便利店信息管理系统就是在这样的大环境下诞生&#xff…

电影《朝云暮雨》观后感

上周看了电影《朝云暮雨》,看完之后,感觉自己整个人都不太好了,也不是说电影太差,只是觉得电影没有传达正能量,让人很不舒服。 (1)演技在线 对于著名的演员“范伟”,或者说&#x…

Payload SDK dji

开发硬件 感谢您的耐心等待,建议您可以考虑下树莓派4B或Jetson Nano开发板,看您需求选择,OSDK即将停止服务,我们建议您使用PSDK来进行开发,PSDK包含了OSDK的功能。Payload SDK 感谢您对大疆产品的支持!祝…

【耕地保卫战:揭秘“占补平衡”】守护粮仓的智慧策略

嗨,各位小伙伴们,今天咱们来聊聊一个与我们每日餐桌紧密相关的主题——耕地占补平衡。在现代化的车轮滚滚向前时,如何在发展与保护之间找到那个微妙的平衡点,确保我们的“米袋子”满满当当呢?这就不得不提到耕地占补平…

SpringSession原理简析

本文借鉴于:Spring-Session 原理简析 - 知乎 (zhihu.com) 目录 概述 使用方式 原理 总结 概述 Session的原理 Session是存在服务器的一种用来存放用户数据的类哈希表结构,当浏览器第一次发送请求的时候服务器会生成一个hashtable和一个sessionid&…

论文阅读--Language-driven Semantic Segmentation

效果很好,文本增加一个词,就能找到对应的分割地方,给出的无用标签也不会去错误分割,而且能理解文本意思,例如dog和pet都能把狗给分割出来 image encoder使用DPT分割模型,大致架构为ViTdecoder,d…

【个人经历分享】末流本科地信,毕业转码经验

本人24届末流本科,地理信息科学专业。 我们这个专业可以说是 “高不成,低不就”的专业,什么都学但都不精。考研我实在是卷不动同学历的人,我在大三的时候就开始考虑转码。 至于我为什么选择转码,选择了GIS开发&#xf…

element ui 下拉框Select 选择器 上下箭头旋转方向样式错乱——>优化方案

目录 前言1、问题复现2、预期效果3、input框样式修改解析4、修改方案 🚀写在最后 前言 测试A:那啥!抠图仔,样式怎么点着点着就出问题了。 前端:啥?css样式错乱了?你是不是有缓存啊&#xff01…

js常用数组方法

1.arr.push() -末尾添加 该方法可以向数组末尾添加一个或多个元素,并返回数组新的长度可以将要添加的元素作为方法的参数传递,这样这些元素将会自动添加到元素的末尾原数组会发生变化 var arr [ 1, 2, 3, 4 ] arr.push(5) console.log(arr) // [ 1, …

linux命令arp的使用

arp arp 命令用于显示和修改 IP 到 MAC 转换表 补充说明 arp 命令 是 Address Resolution Protocol,地址解析协议,是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。而该命令可以显示和修改 arp 协议解析表中的缓…

Mia for Gmail for Mac:Mac用户的邮件管理首选

对于追求高效工作的Mac用户来说,Mia for Gmail for Mac无疑是邮件管理的首选工具。它以其卓越的性能和丰富的功能,为用户带来了前所未有的高效邮件管理体验。 Mia for Gmail for Mac不仅支持多帐号登录和标签选择功能,还提供了邮件分类、垃圾…

linux 中 fd 申请和释放管理(两级 bitmap)

linux 中 fd 的几点理解_linux fd-CSDN博客 通过上边的文章,我们可以知道,在 linux 中,fd 有以下几点需要了解: (1)fd 表示进程打开的文件,是进程级别的资源,不是系统级别的资源 …

【前端每日一题】day11

一个盒子(DIV)里有若干个小盒子,每个小盒子里还可能有多个小盒子 多层盒子结构。每个盒子都有一个唯一的id和 name 属性。现在给出一个盒子的 id 请找到这个盒子并打开,输出这个盒子内部所有小盒子的id和 name,并继续打开这些小盒子输出id和 …

【Unity】Unity项目转抖音小游戏(四)一些常用方法

1.初始化 SDK会在Unity启动前就初始化好,但是又有Init的接口,所以这里通过 StarkSDK.s_ContainerEnv 判断有没有初始化,没有的话就手动初始化 public override void Init(string code, Action callback){Debug.Log("初始化抖音SDK"…

AIGC全面介绍

AIGC(Artificial Intelligence Generated Content),即生成式人工智能,是人工智能1.0时代进入2.0时代的重要标志。这一技术的出现,标志着人工智能从计算智能、感知智能迈向了认知智能的新阶段。以下是关于AIGC的全面介绍…

基于manifest文件批量将coding的仓库导入gitlab中

文章目录 写在前面的话背景编写manifest文件最终效果 写在前面的话 前面有讲过通过manifest清单导入项目到gitlab中,但是实际的操作是不同gitlab实例之间的操作,然而对于在不同gitlab实例的repo迁移而言,显然direct transfer会更合适。 背景…