哪些提供C / C ++运行时库?

问题描述 投票:1回答:1

我对Windows SDK和平台工具集以及C / C ++运行时库有以下两个问题。

  • a)Windows SDK与C / C ++运行时和平台工具集之间的关系是什么?可以说Windows SDK提供了C ++运行时库和平台工具集吗?由于我们主要从Visual Studio项目设置中处理平台工具集,因此想了解Visual Studio是否通过安装所需的Windows SDK版本来控制C ++运行时库和平台工具集版本?

  • b)我想澄清的另一件事是,如果说一个版本的平台工具集可以与其他版本的Windows SDK一起使用是正确的,或者这些完全无关?例如。在我的Visual Studio中,我看到“ Windows SDK版本”是Windows 10,平台工具集是v142。我可以将“ Windows SDK版本”设置为Windows 8.1并将工具集保持为v142吗?如果是,那是什么意思?

这让我很困惑,我似乎无法从不同的人那里得到如此多的不同解释,从而无法获得正确的画面。

c++ visual-studio visual-c++ visual-studio-2012 c++17
1个回答
1
投票

TL; DR:如果您使用的是Visual C ++,并使用Microsoft Docs中的标准REDIST指令,则这些详细信息对您而言实际上并不重要。

在VS 2015及更高版本中,“ C / C ++运行时”已重构为三部分:

  • UCRTBASE.DLL是操作系统的一部分,并通过Windows Update提供服务。 Visual C ++ REDIST程序包中包含它的“下层”版本,但是通常您应该将其视为“ OS”部分。这是“ C运行时”。这些标头,导入库和位于Windows 10 SDK中。您也可以在C:\Program Files (x86)\Windows Kits\10\Source\<version>\ucrt中找到其来源。

  • MSVCP*.DLL这是“ C ++运行时”库,基本上类似于std::vector等。标题,导入库等在Visual C ++产品中。您可以在GitHubthis blog post上找到它的来源。

  • [VCRUNTIME*.DLL具有运行时所需的Visual C ++编译器语言功能的入口点。

还有一些针对特定情况的辅助库:

  • [VCCORLIB*.DLL用于C++/CX extensions(又称/ZW

  • [VCAMP140.DLL用于C++ AMP

  • [VCOMP140.DLL用于OpenMP

  • [CONCRT*.DLL用于在Windows XP上实现C ++ 11 <thread>(在较新版本的Windows上不使用;如果需要,则延迟加载)

请参见this blog postthis one

基本上,C运行时(UCRTBASE)部分是简单的extern "C"接口,因此ABI定义明确,因此可与Visual C ++的多个版本甚至其他编译器一起使用。因此,您所使用的UCRT的确切版本主要取决于您通过WindowsTargetPlatformVersion使用的OS和Windows 10 SDK。您也可以根据this blog在本地部署UCRT。

C ++运行时(MSVCP * .DLL)包含许多内联和公开的内存布局,并且从历史上看,Visual C ++版本之间存在重大变化。就是说,对于VS 2015 Update 3,VS 2017和VS 2019,VC团队在此处保持“二进制兼容”的意义,这意味着如果您拥有一个静态库,该静态库使用v140的PlatformToolset中的C ++ std名称空间组件/ v141,它将成功地通过v142与Visual C ++的later版本进行链接。目前尚不清楚这种情况是否会在将来持续,但对于Microsoft Docs中的特定发行版而言,这是否成立。

VCRUNTIME*.DLL必须与您用来构建最终链接的Visual C ++编译器的版本匹配,因此,这非常适合与您的PlatformToolset匹配。

© www.soinside.com 2019 - 2024. All rights reserved.