我在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 \
哪个是Cs / Vb.net项目的Msbuild工具,而不是本机x86平台的Msbuild工具。 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:/程序文件(x86)/ Microsoft Visual Studio 12.0 / VC / BIN / cvtres.exe
VS 2015: C:/程序文件(x86)/ Microsoft Visual Studio 12.0 / VC / BIN / cvtres.exe
即使在MSBuild链中执行了链接命令,该链接命令也仅正确地加载了特定的cvtres.exe文件(而不是副本)。
msbuild工具链中或我的PC域中的某些IT策略中可能存在一些不一致之处,导致cvtres.exe在通过副本流进去时阻止其执行: C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \
您对此有何建议?如何找到问题所在?
答案 0 :(得分:0)
首先:我应该选择哪个MSBuild?
这取决于。如果本机X86项目来自VS2013和VS2015之前的版本,则可以同时使用C:\Program Files (x86)\MSBuild\14.0\Bin\
和C:\Program Files (x86)\MSBuild\12.0\Bin\
下的两个工具。
无论如何,我建议您使用开发人员命令提示符为vs运行msbuild命令。
打开命令提示符,键入“ where msbuild”,您会发现两条msbuild路径发生。我发现命令提示符在大多数情况下会在C:\Program Files (x86)\MSBuild\vs-version\Bin\
下调用msbuild。(但我无法确保它会赢在某些情况下,不要在Framework64\v4.0.30319\
下调用msbuild。)
因此,使用命令提示符是最合适的方法,因为它将为我们调用相应的msbuild工具。
然后将环境设置为:
您是说要设置Windows环境变量?请避免这样的操作。设置环境变量可能会使设置混乱,并且有时项目属性可能会覆盖这些变量。相反,您可以在项目文件中设置变量,我认为在命令行中设置更好。
您可以找到一些信息here。属性具有范围。 msbuild命令中的属性具有最高优先级,它将覆盖其他任何地方定义的值。
例如:像在配置中使用的一样,使用以下命令: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
希望有帮助。如果问题持续存在,您可以在问题中对其进行任何更新或其他错误消息。