Visual Studio MSBuild错误MSB8066:自定义编译返回-1问题排查
我有一个Visual Studio 2022解决方案,包含两个项目:
- 项目A:负责生成
cpp和hpp文件,生成程序运行正常,仅返回退出值0 - 项目B:需要编译项目A生成的文件,因此将生成的
cpp文件设置为Custom Build目标,hpp文件设置为「Excluded From Build」(仅添加到解决方案方便查看)
项目A已设置为优先构建,文件也能正确生成,但项目B编译时出现以下错误:
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(254,5): error MSB8066: Custom build for '..\sources\ASM\generated\ASM_x64.cpp' exited with code -1.
有时还会伴随警告:
C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(254,5): warning MSB8017: A circular dependency has been detected while executing custom build commands for item "..\sources\ASM\generated\ASM_x64.cpp". This may cause incremental build to work incorrectly.
补充信息:如果生成的文件已存在且为最新状态(输入文件和代码生成器未修改),第二次编译解决方案时可成功通过。
cpp文件的Custom Build设置截图如下:
请问我遗漏了什么配置?
从错误和警告来看,核心问题是Custom Build目标的依赖配置缺失,导致MSBuild无法正确判断生成文件的更新时机,甚至触发循环依赖。以下是具体修复步骤:
1. 补全Custom Build的「输入」和「输出」依赖
当前Custom Build仅指定了命令行,但MSBuild需要明确知道:
- 哪些输入文件(如代码生成器程序、生成所需的模板/源文件)变更时,必须重新执行生成操作
- 生成的最终输出文件路径(即你的
ASM_x64.cpp和对应hpp文件)
操作步骤:
- 右键项目B中的
ASM_x64.cpp→ 属性 → 自定义生成工具 → 常规 - 在「输入」栏添加所有触发生成的依赖项:例如项目A的输出程序路径、生成依赖的
.asm模板文件、配置文件等 - 在「输出」栏填写生成的
ASM_x64.cpp和ASM_x64.hpp的完整绝对路径(或相对于项目目录的路径)
这是解决错误的核心:MSBuild通过输入输出的时间戳验证构建有效性,缺失这些配置会导致MSBuild无法确认文件是否已正确生成,进而抛出错误码-1。
2. 消除循环依赖
警告中的循环依赖,通常是因为以下两种情况:
- 「输入」栏错误包含了
ASM_x64.cpp本身 - 项目依赖配置不当,导致项目B的构建逻辑和生成操作形成闭环
修复方式:
- 检查「输入」栏,确保没有包含生成的
cpp文件 - 确认项目依赖设置:右键解决方案 → 项目依赖 → 勾选项目B依赖项目A,确保项目A优先完成构建
3. 验证增量构建逻辑
完成配置后,执行以下操作验证:
- 清理解决方案(
Build → Clean Solution) - 首次构建:项目A先运行生成文件,项目B正常编译生成的cpp
- 二次构建:由于输入文件未修改,MSBuild会跳过Custom Build步骤,直接完成编译(与你补充的正常场景一致)
额外排查点
如果问题仍存在,检查Custom Build的工作目录:
- 确保代码生成器的工作目录与输出目录一致,或在命令行中使用绝对路径指定输出位置,避免生成文件的实际路径与MSBuild预期路径不匹配
内容的提问来源于stack exchange,提问作者Xavier Bigand

