超级Workaround: MSVC编译工具集的小版本切换

超级Workaround: MSVC编译工具集的小版本切换

作者:HQ |  时间:2019-08-22 |  浏览:198 |  评论已关闭 条评论

朋友们,在开发中你是否有这样的经历:辛辛苦苦,在CodeProject/Github上找到一个合适的开源代码工程,下载下来用VS打开,编译时VS提示: This toolset may be unknown or missing。然后你并没有因此而沮丧,你点燃了一根烟,动了动手指头,将Platform Toolset切换到当前已安装的版本,重新编译,VS告诉你:0个错误,0个警告。没错,一切都是那么美好。

美好的东西可不止这些,可能还有更多。

就比如,近日,VS开发团队Will老哥给我们分享了VS2019的一些有关于工具集切换的更新,让我们来看看是咋回事。
从VS2019 v16.1 Preview 3开始,v142版本的MSVC工具集的小版本并排安装就开始正式启用了。
而早在VS2017那会,VS就开始试水工具集的小版本并排安装特性,而在最新的VS2019中,有一些小的改变需要让各位朋友知道。

通常来说,作为开发者,我们并不需要关心所谓的”小版本”工具集。这个特性主要使用在这样的场景:代码中有Bug,或者MSVC本身有Bug,但是又不能合理的绕开,这个时候,小版本工具集就能起到作用了(也就是所谓的:惹不起,我躲得起)。

安装小版本工具集
VS2017和VS2019最大的区别之一在于它们对小版本工具集的分解方式。从VS2019开始,开发团队开始从架构这一层面对工具集进行了分离,同时也包括小版本的工具集。值得注意的是,VS2017那个时候,只有一个小版本工具集可供安装,到了2019的时候,我们就可以安装我们想要的针对所有不同平台的工具集了。

在VS安装包中,当我们选择”Desktop C++ Developement” Workload时,系统将自动安装最新版本的工具集。如果我们想要安装其他的版本,可以在”individual components”页面进行选择,具体来说,是在”Compilers, build tools, and runtimes”下,我们可以看到所有不同版本的MSVC工具集,包括那些小版本的。

举个栗子。我们可以看到对应于”MSVC v142″的小版本”(v14.20)”和”(v14.21)”。在最新版本中,我们还将看到”(v14.22)”和”(v14.23)”。

使用小版本工具集
当你使用C++ MSBuild来编译你的工程时,使用MSVC小版本工具集的方法和之前一样,没有任何改变。
注意了,小版本的工具集在默认情况下,并不会出现在项目属性的”Platform Toolset”选项下。如果希望启用,则需要编辑你的项目文件(vcxproj)。每一个并排安装的小版本工具集都包含一个.props后缀的文件,这些props文件可以被包含到项目的vcxproj文件中。
在开始做我们的实验之前,我们可以打开编译详细输出,用来观察编译时使用的编译器版本信息。可以在编译命令行添加”-Bv”选项开启,如下图所示:

然后,打开”VC\Auxiliary\Build14.20″目录(这个目录也是VS2019 v16.1 Preview 3的安装目录)时,可以看到有三个文件,将这三个文件中的”Microsoft.VCToolsVersion.14.20.props”拷贝至解决方案目录。

通过右键点击解决方案,点击”Open Folder in File Explorer”的方法来打开解决方案目录。

将”Microsft.VCToolsVersion.14.20.props”拷贝至解决方案目录后,这个props文件将和解决方案Sln文件在同一目录下,如下图所示:

接下来,在VS中将工程卸载,然后就可以编辑工程文件了。在工程文件中,找到如下的语句:

在上面的语句上方(有点绕啊),添加一条import语句,如下:

最后,保存工程文件,然后加载项目。至此,我们就可以重新构建工程,然后从构建日志中,可以看到我们使用的是14.20版本的MSVC编译工具集了。

在CMake中使用小版本工具集
除了VS MSBuild项目,我们还可以在VS的CMake项目中无缝的使用这些工具集。我们需要在CMakeSetting文件中新建一个”VCToolsVersion”的环境变量,然后设置想要使用的版本号,例如”14.20″。可以直接打开CMake Settings对应的JSON文件进行修改。
请注意了,在编译之前,还需要删除之前的缓存,方法为:在”Project > CMake > Cache > Delete Cache”中删除缓存,然后在”Project > Generate Cache”中重新生成一次。为了验证CMake是否使用了正确的工具集,可以在编译输出窗口中观察编译日志。

在命令行中使用小版本工具集
如果不想在VS中配置,也可以通过配置命令行的方式来使用小版本工具集。VS的命令行编译工具位于VS2019 v16.1 Preview3的安装目录,例如:C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\VC\Auxiliary\Build directory。

在这个文件夹中,我们可以看到有4个命令行批处理文件(vsvars*.bat),从中选择任意一个,拷贝一份并进行修改。这些文件内容比较简单,它们直接调用vcvarsall.bat这个文件,区别在于使用了不同的架构参数。按照这个原理,我们可以添加一个新的参数:-vcvars_ver=14.20,来实现对特定版本工具集的调用。

同上,可以通过执行”cl -Bv”来判断编译过程是否使用了正确的版本。

总结
个人来说,本文的配置过程是比较繁琐的,我觉得一部分原因可能是:这个特性使用的人比较少。

但是,俗话说得好:有总比没有好(还挺押韵)。

标签:

评论已关闭。