v140平台工具集与v110工具集选择

本文详细解释了在使用VS2012编译C++动态库时遇到错误MSB8020的解决方法,通过调整项目属性中的平台设置,将源代码的编译平台统一为v140_xp,从而成功解决了编译问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

今天在编译用vs2012编译C++动态库提示:error MSB8020: The builds tools for v140_xp (Platform Toolset = 'v140_xp') cannot be found. To build using the v140_xp build tools ,后来发现源代码用vs2015编译用的是v140平台,vs2012用的是v110平台,在项目属性当中更改下就可以了

 

 

转载于:https://www.cnblogs.com/siqing99/p/5150455.html

<think>嗯,用户在使用批处理脚本通过MSBuild编译解决方案时,遇到了VSVERSION(即PlatformToolset)未成功设置的问题。我需要仔细分析他的脚本,找出可能的原因。 首先,用户脚本中的关键部分是关于环境变量和MSBuild命令的调用。他设置了VSVERSION=v110,然后在MSBuild命令中使用了-p:PlatformToolset=%VSVERSION%。理论上,这应该传递参数给MSBuild,覆盖项目中的PlatformToolset属性。但用户反馈项目属性中的PlatformToolset没有被修改,说明参数没有生效。 可能的原因有几个:首先,检查环境变量是否正确设置。用户使用set VSVERSION=v110,但需要确认v110是否对应正确的工具集版本。例如,Visual Studio 2012使用的是v110,而更高版本可能有不同的标识符,如v140、v141等。如果用户安装的VS版本不同,可能需要调整这个值。 其次,MSBuild命令的语法是否正确。用户使用了start命令来启动MSBuild,但start的语法可能有问题。通常,直接调用MSBuild的路径更可靠。用户的脚本中设置了MSBUILE_DIR变量,但start命令的第一个引号参数是窗口标题,可能错误地将MSBuild路径作为标题,而实际执行的命令参数不正确。正确的做法应该是直接调用%MSBUILE_DIR%msbuild.exe,并传递参数,而不是使用start。 另外,项目文件(.vcxproj)可能已经硬编码了PlatformToolset,导致/MSBuild参数无法覆盖。需要检查项目文件中的PlatformToolset设置是否被条件化,或者是否允许通过命令行参数覆盖。如果项目文件中没有使用条件判断,那么即使传递参数,也可能被项目设置覆盖。 还有,用户的批处理脚本中获取.sln文件路径的方式是否正确?使用了set "inputString=%~1",即获取第一个命令行参数。如果用户没有正确传递.sln路径,可能导致编译的目标不正确,但问题更可能出在参数传递上。 另外,检查MSBuild的版本是否项目要求的兼容。如果用户设置的PlatformToolset版本当前MSBuild版本不匹配,可能导致参数被忽略。例如,使用旧版MSBuild编译需要新工具集的项目,可能无法识别参数。 最后,建议用户添加日志输出,查看MSBuild实际执行的命令和参数,以及生成的详细日志,以确定PlatformToolset是否被正确传递和处理。例如,使用命令行参数 -verbosity:detailed 来获取更多信息。 总结可能的解决方案:修正MSBuild的调用方式,直接使用完整的路径调用msbuild.exe,确保参数正确传递;验证PlatformToolset的值是否正确;检查项目文件是否允许覆盖;添加日志记录以便调试。</think>以下是针对您批处理脚本中`PlatformToolset`参数未生效问题的详细分析和解决方案: --- ### **问题诊断流程** 1. **参数传递验证** ```bat echo 当前工具集参数:%VSVERSION% echo MSBuild路径:%MSBUILE_DIR% echo 输入解决方案:%inputString% ``` *在脚本中添加这三行,确认变量值是否正确* 2. **MSBuild调用方式修正** ```bat rem 错误方式:start命令导致参数传递异常 rem start "%MSBUILE_DIR%" "%inputString%" ... rem 正确调用格式(需完整路径): "%MSBUILE_DIR%\MSBuild.exe" "%inputString%" ^ /t:Rebuild ^ /p:PlatformToolset=%VSVERSION% ^ /p:Configuration=%Config% ^ /p:Platform=x64 ^ /consoleloggerparameters:NoSummary ``` --- ### **关键修复步骤** #### **步骤1:确认工具集标识符** 通过注册表查看本机可用工具集: ```bat reg query "HKLM\SOFTWARE\Microsoft\MSBuild\ToolsVersions" /s | findstr "VCTargetsPath" ``` 常见对应关系: | VS版本 | 标识符 | |--------|------------| | 2012 | v110 | | 2013 | v120 | | 2015 | v140 | | 2017 | v141 | | 2019 | v142 | | 2022 | v143 | #### **步骤2:强制覆盖项目设置** 在`.vcxproj`文件中添加条件判断: ```xml <PropertyGroup> <PlatformToolset Condition="'$(PlatformToolset)' == ''">%VSVERSION%</PlatformToolset> </PropertyGroup> ``` #### **步骤3:完整修复脚本** ```bat @echo off setlocal enabledelayedexpansion rem 设置工具链路径 set "UGII_BASE_DIR=%CNC_UGII_BASE_DIR_10%" set "VSVERSION=v110" & rem 根据实际版本修改 set "Config=Release" set "MSBUILE_DIR=%CNC_VS_MSBUILD_PATH%" rem 接收.sln路径(支持拖放文件到bat) set "inputString=%~1" rem 调试信息输出 echo [DEBUG] 输入解决方案: %inputString% echo [DEBUG] 工具集版本: %VSVERSION% rem 执行编译(注意路径拼接) "%MSBUILE_DIR%\MSBuild.exe" "%inputString%" ^ /t:Rebuild ^ /p:PlatformToolset=%VSVERSION% ^ /p:Configuration=%Config% ^ /p:Platform=x64 ^ /consoleloggerparameters:NoSummary ^ /flp:LogFile=Build.log;Verbosity=diagnostic rem 结果检查 if %ERRORLEVEL% equ 0 ( echo 编译成功!生成的日志:Build.log ) else ( echo 编译失败,请检查日志:Build.log ) pause ``` --- ### **补充验证方法** 1. **查看MSBuild参数解析** ```bat msbuild /pp > expanded.xml ``` *生成预处理后的项目文件,搜索`PlatformToolset`确认值是否改变* 2. **检查环境继承** ```bat set MSBuildEmitSolution=1 msbuild YourSolution.sln /v:d > build.log ``` *在日志中搜索`PlatformToolset`的值传递过程* --- ### **常见问题根源** | 现象 | 解决方案 | |---------------------|----------------------------------| | 项目文件硬编码工具集 | 修改.vcxproj添加条件属性 | | 参数名称拼写错误 | 检查`PlatformToolset`大小写 | | 多平台配置冲突 | 添加`/p:Platform=x64`明确指定平台 | | VS版本不匹配 | 使用VS自带开发人员命令提示符 | 建议通过生成`Build.log`诊断文件,查看MSBuild实际接收的参数值和项目加载过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值