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.pswp.cn/bicheng/14457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14457.shtml
英文地址,請注明出處:http://en.pswp.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會更合適。 背景…