Bazel构建TensorFlow Lite Flex C++ API失败:缺失dnnl_common.h文件
解决TensorFlow Lite Flex构建时oneDNN头文件缺失问题
问题本质
编译报错找不到oneapi/dnnl/dnnl_common.h,不是单纯的文件缺失,是TensorFlow的构建系统没正确识别oneDNN的依赖路径——手动复制文件根本绕不开构建脚本的依赖解析逻辑,白忙活。
具体解决步骤
1. 修正BUILD文件的依赖配置
直接在你的tensorflowlite_flex目标里补全oneDNN的依赖声明:
cc_library( name = "tensorflowlite_flex", srcs = [...], # 你的源文件列表 hdrs = [...], # 你的头文件列表 deps = [ "@dnnl//:dnnl", # 保留其他原有依赖 ], includes = [ "external/dnnl/include", # 加上本地需要的头文件路径 ], )
2. 检查WORKSPACE文件的oneDNN仓库配置
确保oneDNN被正确拉取到Bazel工作区:
http_archive( name = "dnnl", urls = ["https://github.com/oneapi-src/oneDNN/archive/refs/tags/v2.7.0.tar.gz"], sha256 = "替换成对应版本的哈希值", strip_prefix = "oneDNN-2.7.0", )
如果用TensorFlow内置的oneDNN支持,构建时要加对应参数:
bazel build --config=monolithic --config=opt --config=dnnl //tensorflow/lite/delegates/flex:tensorflowlite_flex
3. 用包管理安装oneDNN,别手动复制文件
在Dockerfile里直接装官方开发包,让系统路径自动识别:
RUN apt-get update && apt-get install -y --no-install-recommends \ libdnnl-dev \ && rm -rf /var/lib/apt/lists/*
手动复制文件只会让构建系统找不到正确的依赖链,没用。
4. 构建时显式开启oneDNN支持
执行构建命令时,加上oneDNN的编译开关:
bazel build \ --define=tflite_with_dnnl=true \ --define=build_with_dnnl=true \ //tensorflow/lite/delegates/flex:tensorflowlite_flex
默认配置可能没开oneDNN支持,导致依赖没被引入。
5. 清空构建缓存再试
之前的失败缓存可能搞乱了依赖解析,先清干净:
bazel clean --expunge
然后重新跑构建命令。
内容的提问来源于stack exchange,提问作者Adrián Vélez
相关产品推荐
相关产品推荐

