VSCODE remote ssh 设置 VC++ 环境变量
承接之前的为VSCODE远程开发搭建最小权限Windows SSH环境文章,有一个问题还没解决, 就是如何达到使用 CMake/MSVC 时指定工具链版本这里说的效果,让 CMake 与 ninja 配合, 在编译时能够找到特定版本的 vc++ 工具链。
默认情况下,别说指定版本,那是一个都找不到的。
问了 Deepseek,但他说的包括在CMakeList.txt中加
vendor
设置等方法看着不太靠谱,我没有尝试,并且也不太符合ninja的设计哲学。
具体途径是,将 Windows 服务端的 ssh 的默认 shell 设置为 PowerShellCore
,也就是可执行文件名叫pwsh.exe
的那个,然后为PowerShe
添加 profile
脚本, 在脚本中添加对对vcvarsall
的调用,设置好环境变量。然后,vscode
就相当于运行在一个已经设置好了的Visual Studio 2022 Developer Command Prompt
中,ninja什么的直接用就好了。
我知道网上(包括微软文档)有说远程访问
powershell
的时候,profile
脚本不生效,但起码对于PowerShellCore 7.5
来说,这个办法生效。可能他们说的是旧版的PowerShell
?
理论上,Visual Studio 2022 也提供了原生的
Developer PowerShell for VS 2022
,但是那个快捷方式打开一看是直接加载的 DLL,看起来就不好调教的样子。
首先,登录远程(如何将服务端的 ssh 的默认 shell 设置为 PowerShellCore
参考为VSCODE远程开发搭建最小权限Windows SSH环境),执行:
PS C:\Users\dev> echo $Profile
C:\Users\dev\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
输出的地址就是需要创建的文件。注意新旧两个版本的PowerShell
的profile
文件路径不同,ISE编辑器中执行所输出的路径也各自不同,用哪个就编辑那个。
创建上面输出的文件,并写入以下内容(参考):
$env:MSVC_PROFILE_INIT = "1"
$env:VSLANG=1033
pushd "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build"
cmd /c "vcvarsall.bat x64 10.0.22000.0 -vcvars_ver=14.32.17.2 > NUL & set"|
foreach {
if ($_ -match "=") {
$v = $_.split("=", 2); set-item -force -path "ENV:\$($v[0])" -value "$($v[1])"
}
}
popd
Write-Host "`nVisual Studio 2022 VC++ 14.32.17.2 Command Prompt variables set." -ForegroundColor Yellow
第一行是一个标记,用来在 vscode 连接远程之后检测这个脚本是否生效的,如果脚本生效,那么在vscode中,无论什么shell,都可以访问到
MSVC_PROFILE_INIT
环境变量。
这个profile脚本的核心工作原理是:
- 通过
cmd /c
调用vcvarsall.bat批处理文件,该文件是Visual Studio环境配置的核心脚本 - 使用管道捕获批处理文件执行后的环境变量变更(
set
命令的输出) - 通过PowerShell的
foreach
循环将捕获的环境变量逐个设置到当前会话中 > NUL
重定向隐藏了批处理文件的冗余输出,保持终端干净pushd/popd
确保目录操作不影响后续命令的执行路径
注意事项:
- 需要根据实际VS安装路径调整
pushd
的目录参数 vcvars_ver=14.32.17.2
参数对应特定MSVC工具链版本号$VSLANG=1033
强制使用英语环境避免本地化问题- 选择PowerShell Core而非传统cmd是因为其更强大的管道处理能力
- 环境变量设置采用覆盖方式(
-force
),确保覆盖可能存在的旧配置