本文中说一个变量叫做MSC_VER,是在编译各种c程序的时候,需要做判断的变量。主要用途就是用于判断当前编译器的版本号。然而,这个对于c程序至关重要的变量,市面上居然存在着很多不同的取值,类似为1900,1911等值。这些值和常说的VC14VC15,甚至VS16之间是什么关系?和visual studio 2015/visual studio 2017/visual studio 2019等又是啥关系?

苏南大叔:vc环境,MSC_VER、toolset以及vs之间对应关系是怎样的? - msc_ver对应关系
vc环境,MSC_VER、toolset以及vs之间对应关系是怎样的?(图2-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述MSC_VER的基本情况,如何去区分各个编译器的版本号。

本文测试环境:win10

基本梗概

这一系列的故事的起源是:苏南大叔要在win10上面编译phpsrc。然后就发现,不同版本的phpsrc需要不同版本的vc,然后不同版本的vc又来源于不同版本的visual studio。又经过不断掉坑发现:每个visual studio下面可以安装不同版本的VC

总之,结论就是:phpsrc的不同版本,需要不同的vc,这些vc散落在不同的visual studio里面,默认安装的并不是你所需要的,需要用特殊的手段才能找出其中最合适的那个vc

本文所描述的内容和上一篇中的内容类似,两者之间是相互佐证的关系。上一篇文章的链接地址是:

vc14/vc15/vs16

phpsrcwindows版本的编译指南页面,里面明确的指出:不同的phpsrc需要的vc也是不一样的。

phpsrcPHP_SDK_VStoolset/工具集msc_vervsvs_ver
7.0/7.1vc141401900vs201514.0
7.2/7.3/7.4vc15141(14.11/14.12/14.16)1910、1911、1916vs201715.x
8.0+vs161421920vs201916.x

上述表格是苏南大叔总结的,仅供参考。

phpsrc官方吐槽

visual studiovc toolset之间,实际上是个多对多的关系,并不是大家以及官方所宣布的那样,是个一对一的关系。而为啥说vc14对应vs2015vc15对应vs2017vs16对应vs2019呢?因为这描述的都是默认的安装关系。

对于vc14vc15vs16的说法,只是个大体的分类,为啥到16vs,而不是vc了呢?这个请阅读官方说法:

Support for a certain Visual Studio version means only support for its default platform toolset; building PHP with a non-default platform toolset (such as 14.16 with Visual Studio 2019) may work, but is not recommended.

这段文字里面,提到了苏南大叔在上一篇文章中,重点提及的14.16工具集(为啥归到vs2019里面去了,估计写错了),也就是1916版本。官方明确表态了:1916版本虽然能用,但是不推荐。(苏南大叔测试的结果显示:挺好的啊,咋就不推荐了呢?)

In filenames (and the PHP_SDK_VS environment variable; see below) the Visual Studio version is usually abbreviated. Before Visual Studio 2019, the abbreviation used the scheme “vc#” (for instance, “vc14”). This number (“#”) has tradionally been the major number of the respective platform toolset. The preview releases of Visual Studio 2017 shipped with platform toolset 15.00, so “vc15” was used. The first GA release of Visual Studio 2017, however, shipped with platform toolset 14.10 (to signal the backward compatibility), but the internal Visual Studio version number stayed 15.00.

这段文字就是在吐槽,为啥vc15的版本号实际上是14。为啥vc14vc15,后面就变成了vs16了。这事儿这都赖visual studio,就是被它们给误导了。

phpsrc说到:vc14vc15vs16,这些都是简称,是对于编译环境的简称,也是对应visual studio的默认工具集的描述。这里特别强调了"默认",可以作为苏南大叔对于vc15出现了三个实际版本号的一个回应。

phpsrc还说到:在vs2017的预览版里面,这个工具集都叫15了,结果正式发行版里面工具集版本号又改成了14,而同时visual studio的版本号却是15,简直是不可理喻。(phpsrc方面是极力吐槽visual studio

To avoid confusion “vc15” has been kept. For the Visual Studio 2019 builds (master), the “vc#” has finally been changed to “vs#” (note the “s”), where the number now designates the major internal Visual Studio version number.

鉴于visual studio这一系列的骚操作,phpsrc决定妥协了。为了和他们保持同步,这里就把这个版本号描述为vs16了,这样就表示的是:vs16所默认支持的工具集。

普及一下基本知识,就是vs2017的大版本号是15vs2019的大版本号是16。这也就是上述15/16版本号的由来。

完整的对应关系表

下面的是官方的描述:

最新的visual studio默认自带的toolset表格总结:

msc/toolset_MSC_VERvs
MSC 1.0100
MSC 2.0200
MSC 3.0300
MSC 4.0400
MSC 5.0500
MSC 6.0600
MSC 7.0700
MSVC++ 1.0800
MSVC++ 2.0900
MSVC++ 4.01000Developer Studio 4.0
MSVC++ 4.21020Developer Studio 4.2
MSVC++ 5.01100Visual Studio 97 version 5.0
MSVC++ 6.01200Visual Studio 6.0 version 6.0
MSVC++ 7.01300Visual Studio .NET 2002 version 7.0
MSVC++ 7.11310Visual Studio .NET 2003 version 7.1
MSVC++ 8.01400Visual Studio 2005 version 8.0
MSVC++ 9.01500Visual Studio 2008 version 9.0
MSVC++ 10.01600Visual Studio 2010 version 10.0
MSVC++ 11.01700Visual Studio 2012 version 11.0
MSVC++ 12.01800Visual Studio 2013 version 12.0
MSVC++ 14.01900Visual Studio 2015 version 14.0
MSVC++ 14.11910Visual Studio 2017 version 15.0
MSVC++ 14.111911Visual Studio 2017 version 15.3
MSVC++ 14.121912Visual Studio 2017 version 15.5
MSVC++ 14.131913Visual Studio 2017 version 15.6
MSVC++ 14.141914Visual Studio 2017 version 15.7
MSVC++ 14.151915Visual Studio 2017 version 15.8
MSVC++ 14.161916Visual Studio 2017 version 15.9
MSVC++ 14.21920Visual Studio 2019 Version 16.0
MSVC++ 14.211921Visual Studio 2019 Version 16.1
MSVC++ 14.221922Visual Studio 2019 Version 16.2
MSVC++ 14.31930Visual Studio 2022 Version 17.0

这里特别说明一下,不要为了1911单独去找vs2017 15.3的安装包,没用的。一般找到的都是引导程序,都是在线下载的。不如去组件里面找找vc14.11 toolset,这个就是1911

如何切换toolset

要想切换工具集,首先必须安装它。需要的工具集一般是属于某个visual studio的,但是也可以单独从组件库里面安装。切换的时候,就需要一个vcvarsall.bat文件,给它传入一个-vcvars_ver,即可切换vc工具集。例如:

vcvarsall.bat  x64 -vcvars_ver=14.11.25503
vcvarsall.bat  x64 -vcvars_ver=14.16.27023
vs2022vcvarsall.bat,似乎并不支持-vcvars_ver,切换方式未知。然而同时,phpsrc的最新php@8也只是推荐使用vs2019,并不是vs2022

验证的方式,是执行下面的命令:

cl.exe -Bv

输出的版本号里面的前几位值,去掉小数点,就是_MSC_VER

苏南大叔:vc环境,MSC_VER、toolset以及vs之间对应关系是怎样的? - 版本截图
vc环境,MSC_VER、toolset以及vs之间对应关系是怎样的?(图2-2)

参考文献

总结

本文是苏南大叔经过查看无数资料,外加自己实验总结得出的结论,和一些官方说法存在出入,所以,仅供参考。在后续的windows环境下,phpsrc解释器编译的系列文章中,会以本文为基础展开后续讨论。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。