ldd显示异常库do_not_link_against_nvinfer_builder_resource与链接器日志不符
问题描述
我尝试将库libnvinfer_builder_resource.so.8.5.1链接到项目中,但运行时出现如下错误:
bazel-out/host/bin/gen_trt_ops_py_wrappers_cc: error while loading shared libraries: do_not_link_against_nvinfer_builder_resource: cannot open shared object file: No such file or directory
使用ldd检查发现程序实际链接的是异常库:
do_not_link_against_nvinfer_builder_resource => not found
而非我添加的目标库。我启用了链接器(lld和gold)的verbose日志调试,日志均显示已正确找到并链接目标库:
/usr/bin/ld.gold: Attempt to open bazel-out/k8-fastbuild/bin/_solib_local/_U@local_Uconfig_Ucuda_S_Scuda_Ccufft___Ucuda_Slib64/libnvinfer_builder_resource.so.8.5.1 failed /usr/bin/ld.gold: Attempt to open bazel-out/k8-fastbuild/bin/_solib_local/_U@local_Uconfig_Ucuda_S_Scuda_Ccurand___Ucuda_Slib64/libnvinfer_builder_resource.so.8.5.1 failed /usr/bin/ld.gold: Opened new descriptor 9 for "bazel-out/k8-fastbuild/bin/_solib_local/_U@tensor_Urt_S_S_Ctensor_Urt___Ulib/libnvinfer_builder_resource.so.8.5.1" /usr/bin/ld.gold: Attempt to open bazel-out/k8-fastbuild/bin/_solib_local/_U@tensor_Urt_S_S_Ctensor_Urt___Ulib/libnvinfer_builder_resource.so.8.5.1 succeeded /usr/bin/ld.gold: Unlocking file "bazel-out/k8-fastbuild/bin/_solib_local/_U@tensor_Urt_S_S_Ctensor_Urt___Ulib/libnvinfer_builder_resource.so.8.5.1" /usr/bin/ld.gold: Released descriptor 9 for "bazel-out/k8-fastbuild/bin/_solib_local/_U@tensor_Urt_S_S_Ctensor_Urt___Ulib/libnvinfer_builder_resource.so.8.5.1" /usr/bin/ld.gold: Closed descriptor 9 for "bazel-out/k8-fastbuild/bin/_solib_local/_U@tensor_Urt_S_S_Ctensor_Urt___Ulib/libnvinfer_builder_resource.so.8.5.1"
但搜索不到任何关于do_not_link_against_nvinfer_builder_resource的日志,想请教为何链接器日志显示正确链接,但ldd却显示异常库?
解决方案分析
这种现象的核心原因是**libnvinfer_builder_resource.so.8.5.1本身内部依赖了do_not_link_against_nvinfer_builder_resource**,而非你的链接过程出错。
具体拆解:
- 链接器日志的局限性:链接器日志仅记录你的程序直接链接目标库的过程,不会追踪目标库自身的内部依赖。所以你看到的是程序成功链接了
libnvinfer_builder_resource.so.8.5.1,但该库本身还有未解决的依赖项。 - 特殊依赖的本质:
do_not_link_against_nvinfer_builder_resource是TensorRT的特殊设计——libnvinfer_builder_resource.so是一个占位符库,内部会动态依赖这个特殊名称的库,而这个名称并非独立的实体文件。TensorRT通常通过符号链接、编译时注入rpath等方式,让运行时能找到实际的资源库,这个名称更多是内部版本管理的别名。 - Bazel构建的配置问题:在Bazel环境中,若TensorRT的依赖配置未正确处理这个内部依赖,就会触发运行时错误。常见原因包括:
- TensorRT的Bazel规则未正确设置rpath,导致程序找不到库的实际位置
- 手动链接的
libnvinfer_builder_resource.so.8.5.1不完整,或未与TensorRT其他核心库一起正确引入 - 构建过程未生成
do_not_link_against_nvinfer_builder_resource对应的符号链接
修复建议:
- 避免手动链接该库:
libnvinfer_builder_resource.so是TensorRT内部资源库,应通过官方Bazel规则(如@tensorrt//:nvinfer_builder_resource)引入,而非手动指定.so文件。官方规则会自动处理内部依赖和符号链接。 - 检查TensorRT的Bazel配置:确保WORKSPACE文件正确引入TensorRT依赖,使用官方提供的构建规则,而非自定义链接逻辑。
- 验证rpath设置:用
readelf -d bazel-out/host/bin/gen_trt_ops_py_wrappers_cc查看程序的rpath,确认TensorRT库所在目录是否被包含。若缺失,需在Bazel链接规则中添加linkopts = ["-Wl,-rpath,/path/to/tensorrt/lib"]。 - 检查TensorRT库完整性:确认TensorRT安装包包含所有必要库文件,且版本匹配(8.5.1)。缺失的符号链接常导致此类依赖错误。
内容的提问来源于stack exchange,提问作者Ice Ice
相关产品推荐
相关产品推荐

