Bazel引入本地非Bazel构建C++ OpenVINO库时出现头文件找不到错误
问题根因与修复步骤
你的配置存在3个核心错误,按以下步骤修改即可解决头文件找不到的问题:
1. 拆分外部库与自有代码的BUILD配置
你当前把OpenVINO外部库的编译规则和自有项目的main_c、libbackend.dll规则写在同一个backend/cpp/BUILD文件里,完全混淆了外部仓库和主项目的文件边界。new_local_repository规则要求你单独提供一个给外部库使用的BUILD文件,这个文件里的所有相对路径都是基于你指定的OpenVINO本地根目录解析的。
- 首先在主项目根目录新建
third_party文件夹,在里面新建openvino.BUILD文件,专门存放OpenVINO的库规则 - 修改WORKSPACE中的
new_local_repository配置,指向这个单独的BUILD文件:
new_local_repository( name = "openvino", build_file = "//third_party:openvino.BUILD", path = "C:\\Users\\user\\OpenVINO2022.1.0.dev20220316_OMP\\openvino", )
2. 修正OpenVINO库的BUILD规则
编辑刚才新建的third_party/openvino.BUILD,注意3个要点:不要把运行时dll放到编译源文件里、头文件glob要包含.h后缀、include路径要和头文件引用方式匹配:
cc_library( name = "openvino", srcs = glob(["**/*.lib"]), # 仅放链接阶段需要的.lib导入库,dll是运行时依赖不需要放这里 hdrs = glob(["**/*.hpp", "**/*.h"]), # 补充.h后缀的头文件匹配 # 路径配到openvino头文件目录的上一级,匹配标准的openvino/openvino.hpp引用格式 # 注意先去你本地OpenVINO目录核对实际路径,部分编译版本头文件在runtime/include下,不是src/inference/include includes = ["src/inference/include"], visibility = ["//visibility:public"], )
3. 给自有代码添加OpenVINO依赖,修正头文件引用
你当前的main_c目标没有声明对OpenVINO库的依赖,编译器根本不会把OpenVINO的头文件路径加进搜索目录。
- 编辑
backend/cpp/BUILD,给main_c加上OpenVINO依赖:
cc_library( name = "main_c", srcs = ["main_c.cc"], hdrs = ["utils.h"], deps = [ "//flutter/cpp/c:headers", "@openvino//:openvino", # 新增OpenVINO依赖 ], alwayslink = 1, visibility = ["//visibility:public"] ) cc_binary( name = "libbackend.dll", linkshared = 1, win_def_file = "//flutter/cpp/c:dll_export.def", deps = [ "@openvino//:openvino", ":main_c", ], linkopts = ["-shared"], )
- 修改
main_c.cc里的头文件引用,把Windows反斜杠换成正斜杠(避免转义问题),路径和include配置匹配:
#include "openvino/openvino.hpp"
额外注意事项
- 先去本地OpenVINO路径下核对头文件、lib文件的实际存放位置,不要直接照搬写死的路径,如果你的编译版本头文件存放在
runtime/include目录,就把openvino.BUILD里的includes改成对应路径。 - 确保你Bazel编译用的架构(x64/x86)、编译模式(Debug/Release)和本地编译的OpenVINO库完全匹配,否则编译通过后运行也会出现段错误、符号找不到的问题。
- 运行生成的二进制前,把OpenVINO相关dll所在目录加到系统PATH里,或者把dll复制到
libbackend.dll同目录,避免运行时找不到动态库。
内容的提问来源于stack exchange,提问作者Manasa
相关产品推荐
相关产品推荐

