vc环境,MSC_VER、toolset以及vs之间对应关系是怎样的?
发布于 作者:苏南大叔 来源:程序如此灵动~本文中说一个变量叫做MSC_VER
,是在编译各种c
程序的时候,需要做判断的变量。主要用途就是用于判断当前编译器的版本号。然而,这个对于c
程序至关重要的变量,市面上居然存在着很多不同的取值,类似为1900
,1911
等值。这些值和常说的VC14
,VC15
,甚至VS16
之间是什么关系?和visual studio 2015
/visual studio 2017
/visual studio 2019
等又是啥关系?
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述MSC_VER
的基本情况,如何去区分各个编译器的版本号。
本文测试环境:win10
。
基本梗概
这一系列的故事的起源是:苏南大叔要在win10
上面编译phpsrc
。然后就发现,不同版本的phpsrc
需要不同版本的vc
,然后不同版本的vc
又来源于不同版本的visual studio
。又经过不断掉坑发现:每个visual studio
下面可以安装不同版本的VC
。
总之,结论就是:phpsrc
的不同版本,需要不同的vc
,这些vc
散落在不同的visual studio
里面,默认安装的并不是你所需要的,需要用特殊的手段才能找出其中最合适的那个vc
。
本文所描述的内容和上一篇中的内容类似,两者之间是相互佐证的关系。上一篇文章的链接地址是:
vc14
/vc15
/vs16
在phpsrc
的windows
版本的编译指南页面,里面明确的指出:不同的phpsrc
需要的vc
也是不一样的。
phpsrc | PHP_SDK_VS | toolset/工具集 | msc_ver | vs | vs_ver |
---|---|---|---|---|---|
7.0/7.1 | vc14 | 140 | 1900 | vs2015 | 14.0 |
7.2/7.3/7.4 | vc15 | 141(14.11/14.12/14.16) | 1910、1911、1916 | vs2017 | 15.x |
8.0+ | vs16 | 142 | 1920 | vs2019 | 16.x |
上述表格是苏南大叔总结的,仅供参考。
phpsrc
官方吐槽
visual studio
与vc toolset
之间,实际上是个多对多的关系,并不是大家以及官方所宣布的那样,是个一对一的关系。而为啥说vc14
对应vs2015
,vc15
对应vs2017
,vs16
对应vs2019
呢?因为这描述的都是默认的安装关系。
对于vc14
、vc15
、vs16
的说法,只是个大体的分类,为啥到16
是vs
,而不是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
。为啥vc14
,vc15
,后面就变成了vs16
了。这事儿这都赖visual studio
,就是被它们给误导了。
phpsrc
说到:vc14
、vc15
、vs16
,这些都是简称,是对于编译环境的简称,也是对应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
的大版本号是15
,vs2019
的大版本号是16
。这也就是上述15
/16
版本号的由来。
完整的对应关系表
下面的是官方的描述:
最新的visual studio
默认自带的toolset
表格总结:
msc/toolset | _MSC_VER | vs |
---|---|---|
MSC 1.0 | 100 | |
MSC 2.0 | 200 | |
MSC 3.0 | 300 | |
MSC 4.0 | 400 | |
MSC 5.0 | 500 | |
MSC 6.0 | 600 | |
MSC 7.0 | 700 | |
MSVC++ 1.0 | 800 | |
MSVC++ 2.0 | 900 | |
MSVC++ 4.0 | 1000 | Developer Studio 4.0 |
MSVC++ 4.2 | 1020 | Developer Studio 4.2 |
MSVC++ 5.0 | 1100 | Visual Studio 97 version 5.0 |
MSVC++ 6.0 | 1200 | Visual Studio 6.0 version 6.0 |
MSVC++ 7.0 | 1300 | Visual Studio .NET 2002 version 7.0 |
MSVC++ 7.1 | 1310 | Visual Studio .NET 2003 version 7.1 |
MSVC++ 8.0 | 1400 | Visual Studio 2005 version 8.0 |
MSVC++ 9.0 | 1500 | Visual Studio 2008 version 9.0 |
MSVC++ 10.0 | 1600 | Visual Studio 2010 version 10.0 |
MSVC++ 11.0 | 1700 | Visual Studio 2012 version 11.0 |
MSVC++ 12.0 | 1800 | Visual Studio 2013 version 12.0 |
MSVC++ 14.0 | 1900 | Visual Studio 2015 version 14.0 |
MSVC++ 14.1 | 1910 | Visual Studio 2017 version 15.0 |
MSVC++ 14.11 | 1911 | Visual Studio 2017 version 15.3 |
MSVC++ 14.12 | 1912 | Visual Studio 2017 version 15.5 |
MSVC++ 14.13 | 1913 | Visual Studio 2017 version 15.6 |
MSVC++ 14.14 | 1914 | Visual Studio 2017 version 15.7 |
MSVC++ 14.15 | 1915 | Visual Studio 2017 version 15.8 |
MSVC++ 14.16 | 1916 | Visual Studio 2017 version 15.9 |
MSVC++ 14.2 | 1920 | Visual Studio 2019 Version 16.0 |
MSVC++ 14.21 | 1921 | Visual Studio 2019 Version 16.1 |
MSVC++ 14.22 | 1922 | Visual Studio 2019 Version 16.2 |
MSVC++ 14.3 | 1930 | Visual 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
vs2022
的vcvarsall.bat
,似乎并不支持-vcvars_ver
,切换方式未知。然而同时,phpsrc
的最新php@8
也只是推荐使用vs2019
,并不是vs2022
。
验证的方式,是执行下面的命令:
cl.exe -Bv
输出的版本号里面的前几位值,去掉小数点,就是_MSC_VER
。
参考文献
- https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2
- https://newsn.net/say/vs2017-vc-toolset.html
总结
本文是苏南大叔经过查看无数资料,外加自己实验总结得出的结论,和一些官方说法存在出入,所以,仅供参考。在后续的windows
环境下,phpsrc
解释器编译的系列文章中,会以本文为基础展开后续讨论。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。