visual studio2017内置的c++工具集,到底属于哪个版本?
发布于 作者:苏南大叔 来源:程序如此灵动~
苏南大叔正在试图在win10系统下,搭建phpsrc的编译环境。根据php的官方文档,搭建目前最新的php@7.4的话,需要的先安装visual studio@2017,然后才能继续操作。话题就从这第一步vs2017展开,搭建c++的编译环境的话,到底是需要怎么安装的呢?里面的vc工具集到底是个什么样的版本?

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述vs2017的vc版本号的问题,当然如果您不是很较真,或者也没有意识到这个vc版本号有什么问题的话,本文也是可以略过的。确实无伤大雅,在这个小细节上纠缠,意义也不是特别大。如何您和苏南大叔一样,喜欢较真。那么,本文值得一看。
本文测试环境:win10,vs2017@15.9.45。龙套演员:phpsrc@7.4,phpsdk@2.2.1-dev。
对于同一个vc@1916,php@7.4识别为vc15,php@7.2识别为19.16 untested。
官方描述
根据php的官方描述,在windows环境下编译php@7.4解释器的话,需要vc15,也就是需要安装vs2017。链接如下:

然而,就是这样简简单单的一句话,苏南大叔在里面反复徘徊了好几天。反复尝试多次,才得出结论:官方的这句环境描述的话并不是十分准确。本文将对这句话,做个深入的解析。
php官方关于visual c++编译器兼容性方面的更多描述:
安装visual studio
在微软官方页面上,visual studio的版本号已经是2022。

关于社区版、专业版和企业版,苏南大叔的需求上来说,社区版就足够了。
以前版本的visual studio(例如:visual studio@2017),需要登录之后,下载:
- https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
- https://my.visualstudio.com/Downloads?q=Visual%20Studio%202017
- https://download.visualstudio.microsoft.com/download/pr/4dfffe3f-2a7e-4dea-922b-62d4beca5e36/ca4ebbc3bee27caa44ef91b21bc30837a028c23a046c009600038316e5976b5b/vs_Community.exe
苏南大叔的win10上面,登录着skype。在登录界面上输入正确的skype账号后,居然没有让输入密码就直接登录成功了。这个过程很令人惊讶。
对于本文编译php@7.4的需求,大家最好需要安装vs2017。别以为vs2022向下兼容之类的云云,并不是这样的。
由于,网上各个渠道下载到的vs.exe都是引导安装的。所以,实际上,首页无需登录的vs2022的安装引导程序里面,也是可以选择安装vs2017的各个组件的。所以,关闭默认安装界面,到“可用选项卡”里面去看看。

安装默认项
无论从哪个渠道得到的vs2017的引导安装程序,界面都是非常类似的。推荐的设置是:
勾选“使用c++的桌面开发”,然后默认选项继续安装,就可以获得符合“phpsrc@7.4”的编译需求的vc15了。

只不过,最后编译出的php.exe会显示,使用的是19.16.27045, untested编译的。如果您不介意的话,这个故事也就到此结束了。而事实上,期待的是显示使用vc15编译的。这里仅仅是文字上的转化19.16.27045, untested=>vc15。

其实,19.16.27045也是vc15的成员之一。但是,phpsdk并不认识。
vc工具集目录
安装vs2017的时候,切换到“组件”里面,拉到最下方的c++组件,勾选vc14.11,vc14.12,vc14.13等,然后继续安装。

这样的话,在下面目录中,就可以得到多个可用的vc工具集的合集。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC
勾选vc140的话,

得到的是另外一个目录(仅供参考):
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\
如果仅安装相应的组件,而不安装“工作负载”的话,也就是说不安装"c++桌面环境"的话,是不能完成php内核编译的要求的。错误提示如下:

切换vc工具集
工具集的切换方法是什么呢?
根据微软官方博客描述,这里存在着一个vcvarsall.bat文件,它有一个参数-vcvars_ver,可以用于切换vc工具集。
对于苏南大叔的vs2017社区版,它的位置是:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat切换范例:
vcvarsall.bat x64 -vcvars_ver=14.11.25503vcvarsall.bat x64 -vcvars_ver=14.11vcvarsall.bat x64 -vcvars_ver=14.16.27023
vc14如果正常安装后,也是可以通过上述vs2017的vcvarsall.bat进行切换的。比如:
vcvarsall.bat x64 -vcvars_ver=14.0值得注意的是:不要在一个cmd里面反复测试上述命令,会引起混乱。好像有个看不到的隐藏规则,每次执行的命令是叠加的。
后话就是:vs2022里面的vcvarsall.bat,似乎并不支持-vcvars_ver参数。不过phpsrc的编译,目前也并不需要vs2022。
查看版本号
切换完成后,可以执行命令,查看版本号:
cl -Bv或者
cl.exe -Bvphpsdk的代码显示:它们也是使用上述这个类型命令查看版本号的。

环境变量
如果大家看截图的话,可以发现vcvarsall.bat是可以在任何地方执行的,这是因为苏南大叔把它的目录加入到了环境变量里面。而cl.exe也在环境变量里面,不过,它是被vcvarsall.bat临时有条件(-vcvars_ver)的设置的。

实际上每个toolset都有一个独立的cl.exe等一系列文件,各个文件cl.exe之间版本号是不一致的。
对应关系
对于vs2017里面所带的c++工具集来说,对应关系如下图所示:

其中vc14.11、vc14.12、vc14.13以及vc14.16都是vc15,安装完成后都在一个目录下面。但是,只有vc14.11、vc14.12得到了phpsdk官方认证为通过测试的vc15,vc14.13和vc14.16都是untested状态。
vc14.0虽然也可以通过vs2017的组件进行安装,但是安装完成后是独立的目录。但是,也支持通过vs2017的vcvarsall.bat文件进行切换。vc14.0属于vs2015的一部分。
参考文献
- https://devblogs.microsoft.com/cppblog/visual-studio-build-tools-now-include-the-vs2017-and-vs2015-msvc-toolsets/
- https://docs.microsoft.com/en-us/cpp/build/building-on-the-command-line
- https://newsn.net/say/centos-phpsrc.html
总结
写到这里,本文的行文目的大概就结束了。至于phpsdk和vcvarsall.bat配合的事情,那是另外一篇文章的内容了。