Visual Studio 2017移植C项目:自动生成头文件依赖识别问题
解决Visual Studio 2017中生成头文件的依赖与清理问题
我之前移植Make项目到VS时也踩过类似的坑,核心问题是VS的构建系统对生成文件的依赖识别、清理逻辑和Make差异很大,咱们一步步来搞定:
1. 把生成的a.h标记为项目永久文件
VS默认会把自定义生成的文件当成临时中间产物,全重建时会自动清理。要避免这个情况:
- 右键项目 → 添加 → 现有项,找到生成好的
a.h并添加到项目中。 - 选中
a.h打开属性窗口:- 将项类型设置为头文件,让VS把它视为项目的永久组成部分,不会在清理阶段删除。
- 确认常规选项卡的包含路径,确保你的C源文件能找到这个头文件。
2. 修正CSV文件的自定义生成规则配置
针对CSV文件打开属性窗口,进入自定义生成步骤:
- 在输出字段里,务必填写
a.h的完整路径(比如$(OutDir)a.h),让VS明确知道这个文件是由CSV生成的产物。 - 在附加依赖项中,把生成脚本和CSV文件都列进去(如果脚本是外部工具),确保VS能追踪到生成
a.h的所有前置条件。 - 切换到清理选项卡,不要将
a.h列为需要删除的文件,这样全重建时就不会误删它了。
3. 手动关联C源文件与a.h的依赖
如果VS仍未自动识别依赖,可以手动给包含a.h的C源文件添加关联:
- 选中目标C文件,打开属性窗口 → C/C++ → 高级 → 强制包含文件,填入
a.h的路径(可选,确保编译时能正确找到)。 - 更可靠的方式是编辑项目的
.vcxproj文件(右键项目 → 卸载项目 → 右键 → 编辑项目文件):
找到CSV文件的CustomBuild节点,确保Outputs指向a.h,再添加ClInclude条目标记a.h为项目头文件,示例如下:
保存后重新加载项目,VS就能正确识别<CustomBuild Include="input.csv"> <Command>your_generator_script.exe $(InputPath) $(OutDir)a.h</Command> <Outputs>$(OutDir)a.h</Outputs> </CustomBuild> <ClInclude Include="$(OutDir)a.h" />a.h是项目的一部分,且知晓C源文件对它的依赖。
4. 验证构建流程
完成以上步骤后,先执行一次生成,确认a.h正常生成;再执行全部重新生成,检查a.h是否保留,且依赖它的C文件能正常编译。
内容的提问来源于stack exchange,提问作者Giuseppe Guerrini
相关产品推荐
相关产品推荐

