我在ld: cannot find -lcudnn
上挣扎。
我想在我的项目中使用Cuda和CuDnn。我在集群中工作,Cuda已安装在集群中(请问我没有root权限)。因此,我将Cuda文件复制到本地文件夹中,并按照官方网站上的说明安装Cudnn。但是,ld找不到libcudnn.so
。
$ lsb_release -a
Description: Red Hat Enterprise Linux Server release 7.7 (Maipo)
Release: 7.7
$ ld -lcudnn --verbose
attempt to open //usr/x86_64-redhat-linux/lib64/libcudnn.so failed
attempt to open //usr/x86_64-redhat-linux/lib64/libcudnn.a failed
attempt to open //usr/lib64/libcudnn.so failed
attempt to open //usr/lib64/libcudnn.a failed
attempt to open //usr/local/lib64/libcudnn.so failed
attempt to open //usr/local/lib64/libcudnn.a failed
attempt to open //lib64/libcudnn.so failed
attempt to open //lib64/libcudnn.a failed
attempt to open //usr/x86_64-redhat-linux/lib/libcudnn.so failed
attempt to open //usr/x86_64-redhat-linux/lib/libcudnn.a failed
attempt to open //usr/local/lib/libcudnn.so failed
attempt to open //usr/local/lib/libcudnn.a failed
attempt to open //lib/libcudnn.so failed
attempt to open //lib/libcudnn.a failed
attempt to open //usr/lib/libcudnn.so failed
attempt to open //usr/lib/libcudnn.a failed
ld: cannot find -lcudnn
如果我手动添加libcudnn.so
的库路径
$ ld -L "$CUDA_HOME/lib64" -lcudnn
attempt to open /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so succeeded
-lcudnn (/home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so)
librt.so.1 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found librt.so.1 at /usr/lib64/librt.so.1
libpthread.so.0 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libpthread.so.0 at /usr/lib64/libpthread.so.0
libdl.so.2 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libdl.so.2 at /usr/lib64/libdl.so.2
libstdc++.so.6 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libstdc++.so.6 at /usr/lib64/libstdc++.so.6
libm.so.6 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libm.so.6 at /usr/lib64/libm.so.6
libgcc_s.so.1 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libgcc_s.so.1 at /usr/lib64/libgcc_s.so.1
libc.so.6 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found libc.so.6 at /usr/lib64/libc.so.6
ld-linux-x86-64.so.2 needed by /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so
found ld-linux-x86-64.so.2 at /usr/lib64/ld-linux-x86-64.so.2
ld: warning: cannot find entry symbol _start; not setting start address
这里是我的LD_LIBRARY_PATH
$ echo $LD_LIBRARY_PATH
/home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64
ld以某种方式忽略了LD_LIBRARY_PATH
。由于我没有root权限,因此无法创建符号链接或在ldconfig
中进行更改。因此,设置LD_LIBRARY_PATH
是我可以解决的唯一方法。
感谢您的帮助。
((本来可能是评论,但我对此没有足够的声誉;我只在谈论一般的链接器等用法,我不知道cuda或cudnn项目及其使用的构建工具等)。 )
如果我手动添加libcudnn.so的库路径
$ ld -L "$CUDA_HOME/lib64" -lcudnn
这是一个链接行,没有目标文件可用来链接和创建可执行文件。
attempt to open /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so succeeded -lcudnn (/home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64/libcudnn.so) :
这显示您进入-L
的正确路径。
ld: warning: cannot find entry symbol _start; not setting start address
一旦您使用适当的链接线,可能会解决此问题,也许是通过将您在上面正确指定的-L
路径合并到构建过程中,例如Makefile
或其他合适的方法。
这是我的LD_LIBRARY_PATH
$ echo $LD_LIBRARY_PATH /home/ul/ul_student/ul_dco32/pkg/cuda/10.2/lib64
ld以某种方式忽略了LD_LIBRARY_PATH。由于我没有根权限,我无法创建符号链接或在其中进行更改ldconfig。因此,设置LD_LIBRARY_PATH是我可以解决的唯一方法。
[LD_LIBRARY_PATH
在链接时不供ld
使用,它是用来告诉ld.so
运行时链接程序(动态加载程序)在搜索要加载到正在运行的程序中的共享库时在哪里寻找。