Visual studio "15"的编译器文件目录布局
[原文发表地址] Compiler Tools Layout in Visual Studio “15”
[原文作者] Andrew Pardoe, Mark Levine, Iyyappa Murugandi
[原文发表时间] 2016/10/7
你会发现在VS15中许多关于C++开发发面的改进。 但是其中一些并不明显。 你可能会对下面这个产生疑问:MSVC的编译器工具集原先的安装路径发生了改变.
为什么我们要移动编译器工具集
几年前我们就决定重新分布VC2015的VC编译器的安装路径。 当我们在2002年发布Visual studio.Net时, 我们也发布了仅仅针对x86架构的编译器。 X64以及itanium架构在近期关于Visual studio .Net的开发中才被提及. 硬盘上安装的编译器也就是你需要的针对x86架构的编译器.
随着itanium和x64架构的出现, 我们也引进了相应的针对这些平台的编译器, bin目录下回标识这些编译器。 我们已经将x86架构下的编译器放入了bin目录, 相应的我们添加了子目录x86_ia64和x86_amd64。 这些子目录的编译器可以运行在x86平台并生成64位平台代码。 还有amd64目录下的编译器,运行在x64位下,生成x64位代码.
不止这些, 我们也添加了针对arm平台的编译器。 并且我们加入了交叉平台的编译器, 它可以运行在x64,x86,arm平台. 最终我们形成一个有意义的树状目录。 当开发者想要写一些针对编译器的自动化工作时,他们在脚本中针对每个目标编译器写相应的案例。此外这样的布局限制了做一些有趣的事情, 比如同时并列安装两个不同版本的编译器到需要build的机器上.
Vs 2017 中编译器工具集移动到了哪里
首先,我们讨论编译器工具集的主要部分.它们分布在最上层目录,例如: %ProgramFiles(x86)%\Microsoft Visual Studio\VS15Preview\Common7\IDE\VisualCpp. (注意这个改变的目录也就是 %VCINSTALLDIR%, 之前的目录是%ProgramFiles(x86)%\Microsoft Visual Studio 14\VC.)
• Tools:这个目录一般认为是MSVC编译器的工具集目录。包含较早的bin,crt,include和lib目录,其他的二进制文件。这些二进制元文件包括cl.exe和link.exe,还有相应的头文件以及VC++运行时需要的库文件
• Redist:这个再发行目录里面包含终端开发者build生成的一些应用程序.CRT redist和其他运行时例如AMP ,OpenMP.也包含在里面
• Auxiliary:这个目录包含了辅助编译工作但不是必须的一些工具和脚本.比如配置开发者环境的vcvars*.bat脚本,CppCoreCheckers ,Unit Test libraries。
Preview 5版本中的编译器目录只是一个预览。我们会根据反馈和内部外部开发者的需求改变这个目录甚至是上层目录%VCINSTALLDIR%.
Tools目录
让我们我们仔细看下编译器工具集Tools所在的目录。 和VS2015安装目录不同, 微软Visual C++编译器所在的目录命名为MSVC.如果你选择了Clang with Microsoft codegen选项并安装。 你将会看到MSVC目录后面紧接着一个叫做clangC2的目录, 它里面包含了Clang/C2的二进制文件.
在MSVC目录下包含的子目录的名字就是编译器的版本号。 对于Preview 5版本, 这个子目录为14.10.24516.00. 这个目录的结构与%VCINSTALLDIR%子目录的结构类似, 包括bin,crt,include,lib文件夹.
到现在我们发现了两个不同之处。 第一, MSVC目录也就是VC++工具集可以和其他目录并存, 这里是ClangC2. 第二, 在MSVC目录里可以安装多个版本的VC编译器. 当前还没有简单的办法去安装多个版本。 但对于这样目录结构, 我们可以实现轻松的切换不同版本的VC++编译器。
主机和目标
打开14.10.24516.00\bin目录我们可以看到更多的改变。 在VS2015中, X86工具集是标准工具集, 像amd64_arm目录代表amd64-arm交叉目标编译器。 在VS"15"中, 他们被分成了名为hostXXX,子目录包含X86,X64的多个目录名. 有什么区别呢?
先让我们看下术语的定义。 "Host"代表编译器工具集运行所在的平台。 "Target"指编译器build应用程序,应用程序所要运行的目标平台.在VS2015里, amd64-arm目录包含了运行在x64平台,生成ARM目标平台代码的编译器。 在VS"15"里,目录更加结构化: 所有运行在X64主机下的编译器的目录名为hostx64,在这个目录下面的子目录文件名x64,x86代表着目标架构.
bin目录较众多HostXXX目录,只有一个。 这是因为可执行文件需要运行在主机上. Include目录, 仅仅包含源文件, 源文件与主机和目标平台机器无关. Lib目录仅仅指定了目标平台。同样的, 许多Auxiliary目录下的工具指定了目标架构但与主机无关.
新布局的好处
我们希望你能看到新的编译器布局带来的好处. 随着Visual C++针对Android和IOS平台的案例, 我们需要包含更多的编译器工具. 我们也有机会使开发人员拥有多个版本的VC++编译器。 这个新的布局具有灵活性和可扩展性, 也希望它能持续很多年为我们提供便捷.
由于在vs2015中, windows SDKs并没有与Visual C++ binaries,headers 和libs安装在一起。 他们被安装在同样的 Program Files(x86) 目录里。 Visual C++ SDKs(像DIA SDK)将继续与VC++ toolset安装在一起.
新布局的缺点
更改不一定总带来好处. 许多人正在使用的脚本很可能被这样的布局改变而破坏, 包括我们的安装安装程序也将受到上层目录变更的限制。
请一定签出正在使用的脚本并修改使用新的布局结构。 我们想知道任何你遇到的问题, 我们也想知道这个改变是否很困难。 请在这篇博客下面留言,或者直接发送email到visualcpp@microsoft.com.
查找默认的MSVC工具
后记:许多build系统需要查找默认VC++工具的版本。%VCINSTALLDIR%\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt会随着Visual studio的安装来自动创建, 这个文本里面包含了安装在VS里面的工具集的默认版本号字符。 在通常的Preview 5安装中,%VCINSTALLDIR% 环境变量将会指向%Program Files(x86)%\Microsoft Visual Studio\Visual Studio 15.0\Common7\IDE\VisualCpp.
可以在你的脚本中通过如下命令来解析上面包含版本号的文件
1 2 3 | @rem set BINDIR=get directory for x86-hosted, x86-targeting binaries
set /P VCTOOLS_VERSION=<"%VCINSTALLDIR%\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt"
set BINDIR=%VCINSTALLDIR%\Tools\MSVC\%VCTOOLS_VERSION%\bin\HostX86\x86 |
反馈
你将看到许多新布局带来的好处,我们也知道您也将修复一些很多年没有改变的脚本。我们正在努力试图带给您更简便更平滑的体验。请将您的详细体验情况通知我们。如果对这样布局的设计有什么意见,也请在下面评论出反馈,或者发送email到visualcpp@microsoft.com. 谢谢
已知问题
10/10/2016更新:导致启动工具->Visual studio命令提示符时无法找到vcvars32.bat。在下一个发布版本中会修复这个问题。当前请从windows shell中启动开发者命令行提示符。举例.从开始按钮或者pinning在任务栏中的开发者命令起始符启动.