我不喜欢IDE,因此我安装了VS 2017 Build Tools,因此我可以通过命令行工作。
安装很顺利,一切都在Windows CMD之外,但PowerShell要好得多,我更喜欢使用PS。这里的问题是根据MSDN:
Visual C ++命令行工具使用PATH,TMP,INCLUDE,LIB和LIBPATH环境变量,也可能使用特定于工具的环境变量。由于这些环境变量的值特定于您的安装,并且可以通过产品更新或升级进行更改,因此我们建议您使用vcvarsall.bat或Developer Command Prompt快捷方式而不是自己设置它们。有关编译器和链接器使用的特定环境变量的信息,请参阅CL环境变量和LINK环境变量。
我不应该自己设置环境变量,这对我很好,唯一的问题是当我在PS中运行vcvarsall.bat
时,没有环境变量发生变化。我是PS新手,因此我猜测.bat
个文件无法改变会话环境变量。如果是这样,那么我就无法解决PS问题。作为旁注,CL
和LINK
变量从不出现,我将在下面解释。
我想我应该找出变量是什么。我echo
在运行batch
文件之前和之后将所有变量编辑到文本文件中,并编写了一个简短的Java程序来查找任何新的或修改的内容。这些是them。如您所见,CL
和LINK
变量不存在。
如何解决此问题?我正在考虑编写自己的batch
文件,但如果第一个没有工作,为什么会这样做?我没有在附加的MSDN页面上看到任何内容,也没有看到有关如何为PowerShell工作的任何链接。
答案 0 :(得分:4)
编写一个批处理文件,1)调用vcvarsall.bat
,2)调用PowerShell,这样(这个特定于VS 2015):
@CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %*
@start powershell
%*
允许我们将相同的参数传递给此文件,就像vcvarsall.bat
一样。
cmd
来执行此操作,并且作为子进程,它具有自己的环境块,而不会反映在其上父节点。
答案 1 :(得分:1)
<#
.SYNOPSIS
Invokes the specified batch file and retains any environment variable changes it makes.
.DESCRIPTION
Invoke the specified batch file (and parameters), but also propagate any
environment variable changes back to the PowerShell environment that
called it.
.PARAMETER Path
Path to a .bat or .cmd file.
.PARAMETER Parameters
Parameters to pass to the batch file.
.EXAMPLE
C:\PS> Invoke-BatchFile "$env:ProgramFiles\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
Invokes the vcvarsall.bat file. All environment variable changes it makes will be
propagated to the current PowerShell session.
.NOTES
Author: Lee Holmes
#>
function Invoke-BatchFile
{
param([string]$Path, [string]$Parameters)
$tempFile = [IO.Path]::GetTempFileName()
## Store the output of cmd.exe. We also ask cmd.exe to output
## the environment table after the batch file completes
cmd.exe /c " `"$Path`" $Parameters && set " > $tempFile
## Go through the environment variables in the temp file.
## For each of them, set the variable in our local environment.
Get-Content $tempFile | Foreach-Object {
if ($_ -match "^(.*?)=(.*)$") {
Set-Content "env:\$($matches[1])" $matches[2]
}
else {
$_
}
}
Remove-Item $tempFile
}
$VcVars = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview\VC\Auxiliary\Build\vcvarsall.bat'
Invoke-BatchFile $VcVars x64
cl hello_world.cpp