使用Bazel编译TensorFlow:引入TensorRT头文件
解决TensorFlow编译时无法识别本地TensorRT头文件的问题
核心原因
Bazel采用沙箱化构建机制,直接通过-I指定外部路径或软链接到源码目录的方式会绕过Bazel的依赖管理,导致构建规则无法追踪头文件依赖,从而触发报错。正确的做法是通过Bazel的仓库声明机制将TensorRT纳入官方依赖管理体系。
具体解决步骤
1. 修改TensorFlow源码根目录的WORKSPACE文件
在文件末尾添加以下内容,将本地安装的TensorRT注册为Bazel本地仓库:
new_local_repository( name = "local_tensorrt", path = "/usr/local/TensorRT-8.6.1.6", build_file_content = """ cc_library( name = "tensorrt_headers", hdrs = glob(["include/**/*.h"]), includes = ["include"], visibility = ["//visibility:public"], ) cc_library( name = "tensorrt_libs", srcs = glob([ "lib/libnvinfer.so*", "lib/libnvonnxparser.so*", "lib/libnvparsers.so*", "lib/libnvinfer_plugin.so*", ]), visibility = ["//visibility:public"], ) """, )
这段代码的作用:
- 告知Bazel本地TensorRT的安装路径
- 将TensorRT的所有头文件打包为
tensorrt_headers库,开放给所有构建规则访问 - 将TensorRT的动态库打包为
tensorrt_libs库,供编译时链接使用
2. 执行TensorFlow编译命令
编译时启用TensorRT支持,并确保构建过程能找到TensorRT的动态库:
bazel build \ --config=tensorrt \ --action_env=LD_LIBRARY_PATH=/usr/local/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH \ //tensorflow/tools/pip_package:build_pip_package
--config=tensorrt:启用TensorRT相关编译选项--action_env=LD_LIBRARY_PATH:确保构建沙箱内能读取到TensorRT的动态库
3. 清理旧构建缓存(可选)
如果之前的错误构建缓存残留问题,可以执行清理后重新构建:
bazel clean --expunge
之前方法无效的原因
- 把路径加入
PATH:PATH仅用于查找可执行文件,头文件搜索路径不依赖该环境变量 - 用
-I指定外部路径:Bazel沙箱会隔离外部文件,未通过仓库声明的路径无法被访问 - 软链接到源码目录:Bazel构建规则需要显式声明依赖文件,软链接的文件不在规则依赖列表中,会被沙箱排除
内容的提问来源于stack exchange,提问作者psisis
相关产品推荐
相关产品推荐

