我在我的Windows 10机器(是一台x64机器)上安装了一台旧的VS2013 Professional / VS2015 Professional。我有一个用于本机x86平台的Visual C ++解决方案/项目,我正在尝试使用MSBuild编译它。
首先:我应该选择哪个MSBuild?
我试图从注册表项中选择一个:HKLM \ SOFTWARE \ Microsoft \ MSBuild \ ToolsVersions \ 4.0
但也许这不是正确的工具(这个网站有关于此的说明),因为它指向:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \
哪个是C#/ Vb.net项目的Msbuild工具,而不是本机x86平台。也许最近有关于此更新的Windows更新,更改了注册表值。然后我尝试将其更改为:VS 2013:C:\ Program Files(x86)\ MSBuild \ 12.0 \ Bin \
VS 2015:C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \
然后我将环境设置为:
VS 2013:VCTargetPath = c:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V120
VS 2015:VCTargetPath = c:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V140
我从VS2013 / 2015打开“本机x86命令提示符”(以“以管理员身份运行”),然后运行以下命令:
VS2013:
set VCTargetPath = \ MSBuild.exe project.vcxproj / nologo / p:PlatformToolset = v120; Configuration = Debug / v:detailed
VS2015:
set VCTargetPath = \ MSBuild.exe project.vcxproj / nologo / p:PlatformToolset = v140; Configuration = Debug / v:detailed
我总是得到错误:LNK 1158 - 无法运行\ cvtres.exe
项目文件project.vcxproj正确指示Platform = Win32和PlatformToolset(VS 2013/2015的上述特定之一)。 cvtres.exe文件的路径似乎是正确的:使用sysInternals ProcessMonitor实用程序,我看到正确找到了文件cvtres.exe。但是,当使用msbuild执行时,它首先加载目录中的cvtres.exe副本:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \
然后它尝试加载并执行以下一个:
VS 2013:C:/ Program Files(x86)/ Microsoft Visual Studio 12.0 / VC / BIN / cvtres.exe
VS 2015:C:/ Program Files(x86)/ Microsoft Visual Studio 12.0 / VC / BIN / cvtres.exe
甚至执行链接命令,在MSBuild链之外,只加载特定的cvtres.exe文件(而不是副本),将被正确执行。
msbuild工具链或我的PC域中的某些IT策略可能会出现一些不一致的情况,当cvtres.exe流经副本时阻止cvtres.exe执行:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \
您对如何找到问题的位置有什么建议吗?
首先:我应该选择哪个MSBuild?
这取决于。如果原生X86项目来自早于vs VS2013和VS2015的版本,那么你可以在C:\Program Files (x86)\MSBuild\14.0\Bin\
和C:\Program Files (x86)\MSBuild\12.0\Bin\
下使用这两个工具。
无论如何,我建议您使用developer的命令提示符来运行msbuild命令。
打开命令提示符,键入'where msbuild',你会发现两个msbuild路径发生。我发现命令提示符将在大多数时间内调用C:\Program Files (x86)\MSBuild\vs-version\Bin\
下的msbuild。(但我无法确保它不会在Framework64\v4.0.30319\
下调用msbuild在某些情况下。)
所以使用命令提示符是最合适的方式,因为它将为我们调用相应的msbuild工具。
然后我将环境设置为:
你的意思是你设置Windows环境变量?请避免此类操作。设置环境变量可能会使设置混乱,有时变量可能会被项目属性覆盖。相反,您可以在项目文件中设置变量,我认为在命令行中设置它更好。
你可以找到一些信息here。属性有它们的范围。 msbuild命令中的属性具有最高优先级,可覆盖其他任何位置定义的值。
例如:像在Configuration中使用的那样,使用如下命令:msbuild xxx.vcxproj /p:Configuration=Debug;VCTargetsPath=C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140 ...
一个构建的一个命令,不要将命令分成两部分:一个用于设置值,另一个用于构建。
然后它尝试加载并执行以下内容:v12.0 ...
我认为这是因为你没有设置正确的VCTargetsPath
,你使用的VCTargetPath
不被msbuild引擎识别,所以它不起作用。从Apparao形成我上面提供的问题,你会发现PlatFormToolset property
无法使用未设置的VCTargetsPath。
因此您可以尝试以管理员身份打开开发人员命令提示符,然后使用以下命令:
msbuild xxx\xxx\xxx.vcxproj /nologo /p:Platform=Win32;Configuration=Debug;VCTargetsPath="xxx\xxx" /v:detailed
希望能帮助到你。任何更新或其他错误消息,如果它仍然存在,您可以在问题中更新它。