我在我的Windows 10计算机(是一台x64机器)上安装了一台旧的VS2013 Professional /is 2015 Professional。我有一个用于本机C++平台的可视化x86解决方案/项目,我正在尝试用MSBuild编译它。
首先:我应该选择哪个MSBuild?
我尝试从注册表项中选择一个: HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0
但也许这不是正确的工具(在本站点中有一个关于这一点的指示),因为它指向: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
它是C#/Vb.net项目的Msbuild工具,而不是本地x86平台的工具。也许最近在一个窗口更新中发生了关于此的更改,从而改变了注册表值。然后我尝试将其更改为: VS 2013: C:\Program (x86)\MSBuild\12.0\Bin\
VS 2015: C:\Program (x86)\MSBuild\14.0\Bin\
然后,我将环境设置为:
VS 2013: VCTargetPath = c:\Program (X86)\MSBuild\Microsoft.Cpp\v4.0\V 120
VS 2015: VCTargetPath = c:\Program (X86)\MSBuild\Microsoft.Cpp\v4.0\V 140
我从as 2013/2015打开一个“本机x86命令提示符”(带有“以管理员身份运行”),然后运行以下命令:
VS2013:
设置VCTargetPath = \MSBuild.exe project.vcxproj /nologo /p:PlatformToolset=v120;Configuration=Debug /v:detailed
VS2015:
设置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执行时,它首先加载目录: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\中的cvtres.exe副本。
然后尝试加载并执行以下内容:
VS 2013: C:/Program (x86)/Microsoft VisualStudio12.0/VC/BIN/cvtres.exe
VS 2015: C:/Program (x86)/Microsoft VisualStudio12.0/VC/BIN/cvtres.exe
即使在MSBuild链之外执行只加载特定cvtres.exe文件(而不是副本)的链接命令也是正确的。
msbuild链中可能有一些不一致的地方,或者我的PC域中的一些IT策略在cvtres.exe通过复制时阻止了它的执行:
你对如何找出问题所在有什么建议吗?
发布于 2019-04-05 03:36:20
首先:我应该选择哪个MSBuild?
那得看情况。如果本机X86项目来自比VS2013和VS2015更早的vs版本,那么您可以在C:\Program Files (x86)\MSBuild\14.0\Bin\
和C:\Program Files (x86)\MSBuild\12.0\Bin\
下使用这两个工具。
无论如何,我建议对vs使用developer命令提示符来运行msbuild命令.。
打开命令提示符,键入'where msbuild‘,您会发现出现了两个msbuild路径。我发现命令提示符在大多数时候都会调用C:\Program Files (x86)\MSBuild\vs-version\Bin\
下的msbuild。(但在某些特定情况下,我无法确保它不会在Framework64\v4.0.30319\
下调用msbuild。)
因此,使用命令提示符是最合适的方法,因为它将为我们调用相应的msbuild工具。
然后,我将环境设置为:
您的意思是您设置了windows环境变量?请避免这样的action.Setting环境变量可能会扰乱设置,有时这些变量可能会被项目属性覆盖。相反,您可以在项目文件中设置变量,我认为在命令行中设置它更好。
您可以找到一些信息,这里.The属性有它们的作用域。而且msbuild命令中的属性具有最高优先级,它覆盖在其他任何地方定义的值。
例如:就像您在配置中使用的一样,使用以下命令:msbuild xxx.vcxproj /p:Configuration=Debug;VCTargetsPath=C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140 ...
一个命令用于一个构建,不要将命令分为两个部分:一个用于设置值,另一个用于构建。
然后尝试加载并执行V12.0中的一个.
我认为这是因为您没有设置正确的VCTargetsPath
,所以msbuild无法识别您使用的VCTargetPath
,因此它无法工作。从上面我从Apparao提供的问题中,您会发现PlatFormToolset property
无法使用VCTargetsPath not set。
因此,您可以尝试将developer命令提示符打开为admin,然后使用以下命令:
msbuild xxx\xxx\xxx.vcxproj /nologo /p:Platform=Win32;Configuration=Debug;VCTargetsPath="xxx\xxx" /v:detailed
希望能帮上忙。和任何更新或其他错误消息,您可以更新它在您的问题,如果它仍然存在。
https://stackoverflow.com/questions/55510779
复制相似问题