一次 TensorRT Sample 编译失败的根因分析:`cannot find -lcudnn`
一、表象问题:系统里有 cuDNN,但 linker 找不到
在编译 TensorRT 8.6 samples(如 sampleCharRNN、sampleOnnxMnistCoordConvAC)时,链接阶段报错:
/usr/bin/ld: cannot find -lcudnn
但实际情况是:
libcudnn.so已存在于
/usr/local/cuda-11.8/targets/x86_64-linux/lib- 通过
make CUDNN_INSTALL_DIR=...临时传参可以成功 ldconfig、LD_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
这里有三个必须满足的条件:
- 使用
:=,而不是?=(防止被默认值覆盖) - 放在
Makefile.config的最前面 - 使用 samples 内部真正使用的变量名(如
CUDA_LIBDIR,而不是CUDA_LIB_DIR)
完成后:
make clean
make
所有依赖 cuDNN 的 sample 即可稳定编译。
一句话总结
TensorRT samples 的链接是否成功,
不取决于系统环境是否正确,
而只取决于 Makefile 最终传给 ld 的-L路径。

浙公网安备 33010602011771号