执行cvtres.exe的MSBuild编译问题(错误LNK1158-无法执行cvtres.exe)

时间:2019-04-04 08:02:56

标签: visual-studio-2015 visual-studio-2013 msbuild

我在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 \

您对此有何建议?如何找到问题所在?

1 个答案:

答案 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

希望有帮助。如果问题持续存在,您可以在问题中对其进行任何更新或其他错误消息。

相关问题