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

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - vs2017-cpp
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码的故事。本文讲述vs2017vc版本号的问题,当然如果您不是很较真,或者也没有意识到这个vc版本号有什么问题的话,本文也是可以略过的。确实无伤大雅,在这个小细节上纠缠,意义也不是特别大。如何您和苏南大叔一样,喜欢较真。那么,本文值得一看。

本文测试环境:win10vs2017@15.9.45。龙套演员:phpsrc@7.4phpsdk@2.2.1-dev

对于同一个vc@1916php@7.4识别为vc15php@7.2识别为19.16 untested

官方描述

根据php的官方描述,在windows环境下编译php@7.4解释器的话,需要vc15,也就是需要安装vs2017。链接如下:

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - php官方环境说明
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-2)

然而,就是这样简简单单的一句话,苏南大叔在掉里面了好几天。反复尝试多次,才得出结论:官方的这句环境描述的话并不是十分准确。本文将对这句话,做个深入的解析。

php官方关于visual c++编译器兼容性方面的更多描述:

安装visual studio

在微软官方页面上,visual studio的版本号已经是2022

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - vs下载
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-3)

关于社区版、专业版和企业版,苏南大叔的需求上来说,社区版就足够了。

以前版本的visual studio(例如:visual studio@2017),需要登录之后,下载:

苏南大叔的win10上面,登录着skype。在登录界面上输入正确的skype账号后,居然没有让输入密码就直接登录成功了。这个过程很令人惊讶。

对于本文编译php@7.4的需求,大家最好需要安装vs2017。别以为vs2022向下兼容之类的云云,并不是这样的。由于,网上各个渠道下载到的vs.exe都是引导安装的。所以,实际上,首页无需登录的vs2022的安装引导程序里面,也是可以安装vs2017的。关闭默认安装界面,到“可用选项卡”里面去看看。

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - vs2017-download
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-4)

安装默认项

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

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - c++默认环境安装
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-5)

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

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - phpinfo对比
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-6)

其实,19.16.27045也是vc15的成员之一。但是,phpsdk并不认识。

vc工具集目录

安装vs2017的时候,切换到“组件”里面,拉到最下方的c++组件,勾选vc14.11vc14.12vc14.13等,然后继续安装。

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - 安装额外vc工具集
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-7)

这样的话,在下面目录中,就可以得到多个可用的vc工具集的合集。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - 多个toolset
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-8)

勾选vc140的话,

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - vc14安装
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-9)

得到的是另外一个目录(仅供参考):

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - vc14目录
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-10)

如果仅安装相应的组件,而不安装“工作负载”的话,也就是说不安装"c++桌面环境"的话,是不能完成php内核编译的要求的。错误提示如下:

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - 错误提示
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-11)

切换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.25503
vcvarsall.bat x64 -vcvars_ver=14.11
vcvarsall.bat x64 -vcvars_ver=14.16.27023

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - vcvarsall-bat
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-12)

vc14如果正常安装后,也是可以通过上述vs2017vcvarsall.bat进行切换的。比如:

vcvarsall.bat x64 -vcvars_ver=14.0
值得注意的是:不要在一个cmd里面反复测试上述命令,会引起混乱。好像有个看不到的隐藏规则,每次执行的命令是叠加的。
后话就是:vs2022里面的vcvarsall.bat,似乎并不支持-vcvars_ver参数。不过phpsrc的编译,目前也并不需要vs2022

查看版本号

切换完成后,可以执行命令,查看版本号:

cl -Bv

或者

cl.exe -Bv
phpsdk的代码显示:它们也是使用上述这个类型命令查看版本号的。

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - 查看cl的版本号
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-13)

环境变量

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

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - 环境变量设置
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-14)

实际上每个toolset都有一个独立的cl.exe等一系列文件,各个文件cl.exe之间版本号是不一致的。

对应关系

对于vs2017里面所带的c++工具集来说,对应关系如下图所示:

苏南大叔:visual studio2017内置的c++工具集,到底属于哪个版本? - 关系图
visual studio2017内置的c++工具集,到底属于哪个版本?(图15-15)

其中vc14.11vc14.12vc14.13以及vc14.16都是vc15,安装完成后都在一个目录下面。但是,只有vc14.11vc14.12得到了phpsdk官方认证为通过测试的vc15vc14.13vc14.16都是untested状态。

vc14.0虽然也可以通过vs2017的组件进行安装,但是安装完成后是独立的目录。但是,也支持通过vs2017vcvarsall.bat文件进行切换。vc14.0属于vs2015的一部分。

参考文献

总结

写到这里,本文的行文目的大概就结束了。至于phpsdkvcvarsall.bat配合的事情,那是另外一篇文章的内容了。

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