介绍Universal CRT
[原文发表地址]:Introducing the Universal CRT
[原文发表时间]:2015/3/3 11:00 AM
在去年6月份,我们发布了两篇文章,就Visual Studio 2015 关于Visual C++ C Runtime(CRT) 我们已经做出的一些重大的改动进行了讨论。其中在C 运行时(CRT)重构中我们主要就CRT的主要框架改变进行了说明。在Visual Studio14 CTP1 中C运行时(CRT)的变更中我们列举了所有我们已经实现的重要的功能特性,以及我们已经做了的行为上的改动。
从我们写了那些文章而且发布了第一个Visual Studio2015 的Community Techology Preview(CTP)以来,我们逐月地收到了许多来自你们和客户的反馈。非常感谢你们在Microsoft Connect 发现了这么多优秀的bug,从第一个CTP开始虽然我们还没有就此作C出太多的改变,但我们一直都在努力地定位大家的问题,并努力做出更进一步的改善,而且结束了一些很花费时间的工程。最近发布的Visual Studio 2015 CTP6包含了我们做出的所有的改变。我们也将在接下来的一些文章来再次讨论这些改动:这篇文章讨论从第一个CTP以来主要的架构的改动; 而随后的一篇文章将会列举出所有新的模块已经解决了的bug 以及更详细的最新修改。
在我们去年6月的文章中,我们解释了我们是如何把CRT分成两个逻辑部分:一个是VCRuntime,它包含支持编译器的必备功能,比如就像进程启动和异常处理等;另一个“稳定的”包含所有CRT的完整类库部分,将来我们可以随时支持以及服务,而不是需要随着每个新版的Visual
Studio来发布新版本的动态链接库。当时,这个“稳定的”部分是以提供2个类库的形式:AppCRT和DesktopCRT(发布的动态链接库命名为appcrt140.dll和desktopcrt140.dll)。
VCRuntime依旧和以前的CTP版本一样的形式和相同的内容存在。在最新的CTP6中,我们已经做了较大的改动,它已经在“稳定的”部分中了。AppCRT和DesktopCRT已经合并到一个类库之中了,我们把它称作Universal CRT。新的动态链接库命名为ucrtbase.dll(release)和ucrtbased.dll(debug);他们不会包含版本号,因为我们将对它们做随时的支持以及服务。
Universal CRT是Windows操作系统的一个组件。它将作为Windows 10的一部分,首次发布会在一月技术预览版中,另外通过Windows自动更新对老版本的操作系统进行支持。
用Universal CRT创建软件
以前,所有的CRT的头文件,源文件和类库都是作为Visual C++ SDK的一部分来部署的,安装在你的Visual Studio安装目录下的VC子目录中(通常是C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC)。VCRuntime的文件依然是Visual C++ SDK的一部分。头文件,源文件和类库现在都是作为独立的Universal CRT SDK的一部分来部署的;它默认安装在C:\Program Files (x86)\Windows Kits\10。Debug的urtbased.dll也一样是这个SDK的 一部分,并且安装在系统的文件夹中。
我们已经更新了Visual C++ MSBuild的Props和Targets文件,给Include和类库路径中添加了新的Universal
CRT目录。 如果你创建一个新的Visual Studio 2015的工程或者升级一个已有工程到Visual
Studio 2015,通常它应该自动的添加这些新的目录路径。如果你升级一个工程,而它却没有用Visual C++ MSBuild的Props和Targets文件,或者没有继承地用到那些Props和Targets文件中默认的include和类库路径。你必须手动更新你的工程来包含新的目录路径。你能用下面的MSBuild的属性去找到Universal
CRT SDK文件:
$(UniversalCRT_IncludePath)
$(UniversalCRT_LibraryPath_x86)
$(UniversalCRT_LibraryPath_x64)
$(UniversalCRT_LibraryPath_arm)
只要你不用/nodedefault选项,在你关联你的项目时所有正确的类库文件都能找得到。如果你用了/nodedefault选项,你关联的时候,将需要关联几个外部类库。 例如,尽管为了使用CRT动态链接库,你可能预先已经关联上了msvcrt.lib文件,但是你现在需要关联vcruntime.lib和ucrt.lib。这里提供一个表格显示你需要连接的类库:
Release DLLs (/MD ): msvcrt.lib vcruntime.lib ucrt.lib
Debug DLLs (/MDd): msvcrtd.lib vcruntimed.lib ucrtd.lib
Release Static (/MT ): libcmt.lib libvcruntime.lib libucrt.lib
Debug Static (/MTd): libcmtd.lib libvcruntimed.lib libucrtd.lib
用Universal CRT 部署软件
在过去,你或许使用过在有关Visual C++的开发中描述过的某一种方法根据你的软件去重新部署Visual C++ 库。然而对于除过Universal CRT之外的所有的Visual C++库而言,不管哪一种部署模式(中心的,本地的或者是静态链接) ,早期使用过的或者现在仍然在使用的,在部署方法上其实都是一样的。
然而,基于上面说到的,将Universal CRT移动到Windows 操作系统中,这些改变,,有一些是值得我们注意的改动。
1. Universal CRT 是一个Windows 操作系统组件,是Windows10的一部分。在Windows10以前的Windows
版本,Universal CRT是通过Windows Update来部署的。对于从Vista到Windows 8.1系统 而言有一些Windows Update MSU 软件包。当前的这些MSU软件包是作为VCRedlist安装的一部分来安装的。在Visual Studio 2015以后的版本中,这些MSU 软件包将会作为Universal CRT SDK 的一部分独立部署,在support.microsoft.com上你可以下载到可用的版本。
2. 如果你搭建的软件是用在Windows 操作系统上,并且不确定该操作系统是否安装了Universal CRT,(比如说Windows 8.1 和以下的版本),那么你的软件将需要依赖上面提到的Windows Update 软件包去安装Universal CRT。
3. 如果当前你在用VCRedlist(我们的重部署软件包),它可以帮你做以前你需要做的事情。Visual Studio 2015 VCRedlist 软件包包含了上面涉及的Windows Update 软件包,仅仅只需要安装了VCRedlist, Visual C++ 库和Universal CRT就将会被安装。这也是我们建议的部署机制。甚至对于Windows XP, 即使它没有Universal CRT的 Windows Update MSU, VCRedlist 也将会自己部署Universal CRT。
4. 如果你当前正在静态链接Visual C++ 库函数,那么相关的所有事都能为你照旧工作。在性能和维护方面,我们强烈推荐不要静态链接Visual C++库函数。但是我们仍然意识到,在有些情况下还是有需求要用到静态链接库,这是我们将会继续支持这种静态链接库的原因。
5. 对于Universal CRT而言不会存在一个合并模式。如果你当前正在使用CRT 合并模式并且仍然想去集中地部署Visual C++库函数 ,我们建议你移到上面提到的Windows Update 软件包中或者VCRedlist中,或者你也可以选择静态地链接到Universal CRT 和Visual C++ 库函数。
6. 不支持Universal CRT 本地应用程序的部署。Universal CRT 是一个Windows 操作系统组件,最终(长期来看) Universal CRT将会像其他今天的其他操作系统组件一样经常性的出现在每一台机器上。我们意识到今天正在存在的操作系统版本中有一些并不是最新的。也就是对你们,以及我们的客户而言,需要在某些时候去支持这些操作系统。我们希望用Windows Update 软件包或者静态链接可以满足这个。在这次发布的版本中,我们尽力重构CRT的目标之一就是减少运行时的扩散问题,因为这类问题久而久之会使计算机结束在大量在运行时库文件的拷贝中。
就像我们之前所说的那样,尽管去年六月份在CTP1中我们在开始介绍重构CRT,但我们已经解决了一些bug并对CRT做出了其他的改善。过了这周我们将会发布第二篇文章去讨论在具体细节上一些更大的改变,与此同时,关于您对于新的Universal CRT 的反馈我们将非常感兴趣。
James McNellis and Raman Sharma
Visual C++ Libraries
Comments
- Anonymous
March 01, 2016
我想知道怎么能不用ucrt,用以前的vcrt,这样我就不需要考虑本地部署的问题。现在本地部署需要把ucrt的所有dll都要复制到目标目录,太麻烦,也太零散了。