一次 TensorRT Sample 编译失败的根因分析:`cannot find -lcudnn`

一、表象问题:系统里有 cuDNN,但 linker 找不到

在编译 TensorRT 8.6 samples(如 sampleCharRNNsampleOnnxMnistCoordConvAC)时,链接阶段报错:

/usr/bin/ld: cannot find -lcudnn

但实际情况是:

  • libcudnn.so 已存在于
    /usr/local/cuda-11.8/targets/x86_64-linux/lib
  • 通过 make CUDNN_INSTALL_DIR=... 临时传参可以成功
  • ldconfigLD_LIBRARY_PATH/etc/ld.so.conf.d 全部无效
  • 有些 sample(如 MNIST)却能正常编译

这说明:问题并不在系统环境,而在构建系统本身


二、根本原因:TensorRT samples 不使用系统 linker 搜索路径

TensorRT samples 的 Makefile 显式向 ld 传递 -L 路径

g++ ... -L/usr/local/cuda/lib64 -lcudnn

而你的 cuDNN 实际路径是:

/usr/local/cuda-11.8/targets/x86_64-linux/lib

关键结论是:

Makefile 中传给 ld 的 -L,完全覆盖了系统默认搜索路径

因此:

  • 即使 ldconfig -p | grep cudnn 正确
  • 即使 LD_LIBRARY_PATH 已配置
  • 只要 Makefile 的 -L 指向错误目录,-lcudnn 就一定失败

同时,MNIST sample 能成功,是因为它 不依赖 cuDNN,所以不会触发该链接问题。


三、最终解法:在 Makefile.config 中“强制绑定”正确路径

真正的永久解决方案,不是改系统,而是改 TensorRT 的 Makefile.config,并且注意三个工程细节:

.SUFFIXES:

CUDA_INSTALL_DIR  := /usr/local/cuda-11.8
CUDNN_INSTALL_DIR := /usr/local/cuda-11.8/targets/x86_64-linux

CUDA_LIBDIR   := $(CUDA_INSTALL_DIR)/targets/x86_64-linux/lib
CUDNN_LIBDIR  := $(CUDNN_INSTALL_DIR)/lib
CUDNN_INC_DIR := $(CUDNN_INSTALL_DIR)/include

这里有三个必须满足的条件:

  1. 使用 :=,而不是 ?=(防止被默认值覆盖)
  2. 放在 Makefile.config 的最前面
  3. 使用 samples 内部真正使用的变量名(如 CUDA_LIBDIR,而不是 CUDA_LIB_DIR

完成后:

make clean
make

所有依赖 cuDNN 的 sample 即可稳定编译。


一句话总结

TensorRT samples 的链接是否成功,
不取决于系统环境是否正确,
而只取决于 Makefile 最终传给 ld 的 -L 路径。

posted @ 2026-01-08 20:11  seekwhale13  阅读(2)  评论(0)    收藏  举报