有时,当我们需要指定 VS 工具链时(例如指定使用 MSVC CLI 的 Clang:clang-cl.exe),纯粹使用 CMake 就不太够用。本文介绍在 PowerShell 中检测 VS 安装,并使用其命令行工具的方法。
定位 VS
Visual Studio (>=2017) 成功安装后,会在本机同时安装一个 vswhere.exe
的软件,该软件可以自动寻找 VS。这样一来不管 VS 安装在哪一个盘符,也不管有多少个不同版本的 VS,都可以利用该软件轻松定位。我们可以通过 ${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe
来调用该软件。注意,其中的 $ENV:XXX
语法是 PowerShell 语法。
$VsWhere = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
& $VsWhere -latest -property installationPath
上述命令给出了本机最新版本的 VS 的安装地址。你也修改参数,获取诸如版本号之类的其余信息。
导入 VS 命令行工具
其实微软官方提供了一套命令行工具,它可以自动把 VS 所需的各种环境变量设置好。安装 VS 后可以看到启动菜单里多出来的 Developer PowerShell for VS 其实就是普通的 PowerShell 添加了一些启动参数而已。我们可以直接把这些启动参数抄下来用:
Import-Module "<VsInstallDir>\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $VsInstallDir -SkipAutomaticLocation -Arch amd64 -HostArch amd64
这里的 <VsInstallDir>
应当是上一步获得的 VS 安装目录。
总结
综上所述,我们可以写出这样一个函数:
function Use-VS {
$VsWhere = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$VsInstallDir = & $VsWhere -latest -property installationPath
Import-Module "$VsInstallDir\Common7\Tools\Microsoft.VisualStudio.DevShell.dll"
Enter-VsDevShell -VsInstallPath $VsInstallDir -SkipAutomaticLocation -Arch amd64 -HostArch amd64
}
该函数的执行时间略长(~2s),为了方便,该函数可以放入 $PROFILE
,这样既能随时调用,又不会每次启动 PowerShell 都花很久。
只需调用这个函数,就能自动在当前 PowerShell 会话中激活 VS 环境。此时,VS 安装后的 cl.exe
, clang.exe
, clang-cl.exe
, ninja.exe
等软件都可以直接通过命令行调用了。例如,在我的项目中我想指定 VS 不要使用默认的 cl.exe
,而使用 MSVC 命令行接口的 LLVM 工具链,那么可以直接给 CMake 传入相应的参数 CMAKE_C_COMPILER=clang-cl.exe
以及 CMAKE_CXX_COMPILER=clang-cl.exe
。
Comments | NOTHING