VS2022 Community自定义生成工具配置修改不生效,重启后自动恢复
问题分析与解决:VS自定义生成工具Outputs配置无法删除且自动恢复的问题
场景概述
- 接手离职同事的VC++解决方案,项目包含SWIG工具的输入文件
MyFile.i - 右键该文件进入属性→配置属性→自定义生成工具→常规,可见
swig.exe调用参数为%(FullPath),编译时swig.exe可正常执行 - 编译后出现如下警告:
6>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(245,5): warning MSB8065: Custom build for item "....\swig\MyFile.i" succeeded, but specified output "t:\MyEmployer\MyCodeBase\MyProject\auxiliary\visualstudioprojects\vs2017_wrap.cxx" has not been created. This may cause incremental build to work incorrectly.
- 属性对话框中
Outputs配置为$(InputName)_wrap.cxx;%(Outputs),但$(InputName)自VS2015起已不再支持,导致输出路径缺失文件名 - 尝试删除
$(InputName)_wrap.cxx后点击确定,清理并重新生成解决方案,警告仍存在;重启VS后该配置项自动恢复 - 在挂载同一文件系统的Linux上搜索,未找到
_wrap.cxx、swig.exe及$(InputName)相关内容
配置定义位置
这些自定义生成工具的配置并非仅存在于VS属性对话框的可视化界面,实际存储在以下位置:
- 项目文件(.vcxproj):直接打开项目的
.vcxproj文件,搜索<CustomBuild>或Outputs相关节点,可找到针对MyFile.i的输出配置规则。属性对话框仅读取并展示这里的内容,直接修改对话框可能因缓存或优先级问题不生效。 - 项目属性表(.props):若项目引用了外部属性表,检查所有关联的
.props文件,全局的SWIG自定义生成规则可能定义在这里,导致单个文件的配置被覆盖。 - 用户级MSBuild配置:较少见,可检查
%APPDATA%\Microsoft\MSBuild\v4.0目录下的自定义目标文件,但优先排查项目文件和属性表。
无法删除的原因
- 配置优先级覆盖:如果属性表或项目文件中存在全局的SWIG规则(优先级高于单个文件配置),你在单个文件属性中删除的设置会被全局配置覆盖,重启VS后自动恢复。
- VS缓存未更新:VS会缓存项目配置,修改对话框设置后,缓存未同步更新到项目文件,重启后读取旧缓存恢复原配置。
- 隐式继承的目标规则:MSBuild的系统目标文件(如
Microsoft.CppCommon.targets)中可能存在针对.i文件的默认自定义生成规则,自动应用到所有.i文件,覆盖你修改的单个文件配置。
解决步骤
- 直接编辑项目文件:
- 关闭VS,用文本编辑器打开项目的
.vcxproj文件 - 搜索对应
MyFile.i的<CustomBuild>节点,删除其中包含$(InputName)_wrap.cxx的Outputs属性,或者修改为正确的输出路径(例如$(SolutionDir)swig\MyFile_wrap.cxx) - 保存文件后重新打开VS,清理并重新生成解决方案
- 关闭VS,用文本编辑器打开项目的
- 检查并修改属性表:
- 打开项目属性→属性管理器,查看所有关联的
.props文件 - 逐个打开属性表,搜索
Outputs或SWIG相关配置,删除或修改其中的$(InputName)_wrap.cxx条目
- 打开项目属性→属性管理器,查看所有关联的
- 清除VS缓存:
- 删除项目目录下的隐藏
.vs文件夹 - 清理
%TEMP%目录下的MSBuild缓存文件,重启VS后重新加载项目
- 删除项目目录下的隐藏
内容的提问来源于stack exchange,提问作者Swiss Frank
相关产品推荐
相关产品推荐

