簡體   English   中英

什么提供了 C/C++ 運行時庫?

[英]What provids C/C++ runtime libraries?

我對 Windows SDK 和平台工具集和 C/C++ 運行時庫有以下 2 個問題。

  • a) Windows SDK 與 C/C++ 運行時和平台工具集有什么關系? 說 C++ 運行時庫和平台工具集都由 Windows SDK 提供是否正確? 由於我們主要從 Visual Studio 項目設置中處理平台工具集,因此想了解 Visual Studio 是否通過安裝所需版本的 Windows ZF20E3C5E50BF8B3D37AZ5D66 來控制 C++ 運行時庫和平台工具集版本?

  • b)我想澄清的另一件事是,如果說一個版本的平台工具集可以與不同版本的 Windows SDK 一起使用是正確的,還是這些完全不相關? 例如。 在我的 Visual Studio 中,我看到“Windows SDK 版本”是 Windows 10,平台工具集是 v142。 我可以將“Windows SDK 版本”設置為 Windows 8.1 並將工具集保持為 v142 嗎? 如果是,那是什么意思?

這讓我很困惑,我似乎無法從不同的人那里得到如此多不同的解釋。

TL;DR:如果您使用 Visual C++,並使用Microsoft Docs中的標准 REDIST 指令,那么這些細節對您來說並不重要。

在 VS 2015 及更高版本中,“C/C++ 運行時”已被重構為三個部分:

  • UCRTBASE.DLL是操作系統的一部分,通過 Windows 更新提供服務。 Visual C++ REDIST package 中包含它的“下級”版本,但通常您應該將其視為“操作系統”部分。 這是“C 運行時”。 這些頭文件、導入庫和位於 Windows 10 SDK 中。 您也可以在那里找到它的源代碼C:\Program Files (x86)\Windows Kits\10\Source\<version>\ucrt

  • MSVCP*.DLL這是“C++ 運行時”庫,基本上像std::vector等。 頭文件、導入庫等位於 Visual C++ 產品中。 根據這篇博文,您可以在GitHub上找到它的源代碼。

  • VCRUNTIME*.DLL具有 Visual C++ 編譯器語言功能在運行時所需的入口點。

還有一些針對特定場景的輔助庫:

  • VCCORLIB*.DLL用於C++/CX 擴展(又名/ZW

  • VCAMP140.DLL用於C++ AMP

  • VCOMP140.DLL用於OpenMP

  • CONCRT*.DLL is used to implement C++11 <thread> on Windows XP (not used on newer versions of Windows; it's delay loaded if required)

請參閱這篇博客文章這篇文章。

本質上,C 運行時(UCRTBASE)部分是一個簡單的extern "C"接口,因此 ABI 定義明確,因此可用於 Visual C++ 甚至其他編譯器的多個版本。 因此,您使用的 UCRT 的確切版本主要取決於您通過WindowsTargetPlatformVersion使用的操作系統和 Windows 10 SDK。 您也可以根據此博客applocal 部署 UCRT。

C++ 運行時 (MSVCP*.DLL) 包括大量內聯和暴露的 memory 布局,歷史上 Visual ZF6F87C9FDCF8B3C3F07F93F1EE8712C9 版本之間存在重大變化也就是說,對於 VS 2015 Update 3、VS 2017 和 VS 2019,VC 團隊在此處強調保持“二進制兼容”,這意味着如果您有一個PlatformToolset庫,該庫使用 C++0stv14 命名空間組件,它將成功鏈接到更高版本的 Visual C++ 到 v142。 目前尚不清楚這是否會在未來保持不變,但對於每個Microsoft Docs的這組特定版本來說確實如此。

VCRUNTIME*.DLL需要與您用於構建最終鏈接的 Visual C++ 編譯器的版本相匹配,因此這非常適合您的PlatformToolset

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM