Visual Studio可跳转头文件但编译失败:找不到onnxruntime_cxx_api.h
重构Visual Studio解决方案后NuGet包头文件编译找不到,但IDE可定位的解决方法
问题背景
对Visual Studio解决方案进行文件系统重构后,将源码与VS项目文件分离为sources和vs_stuff目录,使用NuGet包Microsoft.ML.OnnxRuntime v1.12.0时出现编译错误:
Error C1083 Cannot open include file: 'onnxruntime_cxx_api.h': No such file or directory
但IDE可通过Ctrl+左键点击或「转到文档」定位到该头文件,路径为$(SolutionDir)\packages\Microsoft.ML.OnnxRuntime.1.12.0\build\native\include\onnxruntime_cxx_api.h。
解决方案结构如下:
./solution/ ./solution.sln ./packages/ ./Microsoft.ML.OnnxRuntime.1.12.0/ ... ./sources/ ./projectA/ 项目A源码文件 ./projectB/ 项目B源码文件 ./vs_stuff/ ./projectA/ 项目A的vcxproj、packages.config等VS文件 ./projectB/ 项目B的vcxproj、packages.config等VS文件
核心原因
IDE的IntelliSense与编译器的路径查找逻辑不同:
- IntelliSense通过NuGet包缓存、packages.config或解决方案级的包索引定位头文件
- 编译时依赖项目vcxproj中的NuGet自动生成的.targets文件引用,重构后项目路径变化导致该引用的相对路径失效,无法自动添加包含目录
解决步骤
1. 检查vcxproj中的NuGet Targets引用
打开vs_stuff下项目的.vcxproj文件,查找是否存在类似以下的Import节点:
<Import Project="..\..\packages\Microsoft.ML.OnnxRuntime.1.12.0\build\native\Microsoft.ML.OnnxRuntime.targets" Condition="Exists('..\..\packages\Microsoft.ML.OnnxRuntime.1.12.0\build\native\Microsoft.ML.OnnxRuntime.targets')" />
- 若相对路径错误(因重构后项目位置变化),将其修改为使用
$(SolutionDir)的绝对引用,避免相对路径偏差:
<Import Project="$(SolutionDir)packages\Microsoft.ML.OnnxRuntime.1.12.0\build\native\Microsoft.ML.OnnxRuntime.targets" Condition="Exists('$(SolutionDir)packages\Microsoft.ML.OnnxRuntime.1.12.0\build\native\Microsoft.ML.OnnxRuntime.targets')" />
2. 强制NuGet重新还原并重装包
- 在Visual Studio中右键解决方案 → 「管理解决方案的NuGet程序包」,点击「还原」按钮
- 或打开「包管理器控制台」,执行命令:
Update-Package -reinstall Microsoft.ML.OnnxRuntime
此操作会让NuGet重新生成适配当前项目路径的.targets文件及引用配置。
3. 清理重建解决方案
- 执行「生成」→「清理解决方案」
- 手动删除项目目录下的
obj和bin文件夹 - 重新执行「生成解决方案」,清除旧路径缓存的影响
4. 验证包含目录配置(可选)
若上述步骤无效,可检查项目属性的包含目录:
- 右键项目 → 属性 → VC++目录 → 包含目录
- 确认是否存在
$(SolutionDir)packages\Microsoft.ML.OnnxRuntime.1.12.0\build\native\include,若缺失可手动添加(优先通过NuGet自动处理,此为兜底方案)
内容的提问来源于stack exchange,提问作者AnonA
相关产品推荐
相关产品推荐

