collect2:错误:ld返回1退出状态(-lcudnn)

时间:2020-04-03 16:15:54

标签: linux linker gnu ld

编辑1

我忘了提到我要使用theano库。

联系管理员后,cudnn模块由他们提供。但是,我仍然遇到相同的错误。

$ module load devel/cudnn/10.2
$ python -c "import theano"
Can not use cuDNN on context None: cannot compile with cuDNN. We got this error:
/pfs/work7/workspace/scratch/ul_dco32-conda-0/conda/envs/my_env/bin/../lib/
gcc/x86_64-conda_cos6-linux-gnu/7.3.0/../../../../
x86_64-conda_cos6-linux-gnu/bin/ld: cannot find -lcudnn
collect2: error: ld returned 1 exit status

Mapped name None to device cuda: Tesla V100-SXM2-32GB (0000:3A:00.0)
$ vi $HOME/.theanorc
[global]
floatX = float32
device = cuda

[cuda]
root=$CUDA_HOME/bin

[dnn]
include_path=$CUDA_HOME/include
library_path=$CUDA_HOME/lib64

[lib]
cnmem=1

因此,很可能我遇到了链接问题,但是我找不到它。

问题

我在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是我可以解决的唯一方法。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

(这可能是一条评论,但我对此没有足够的声誉;我只在谈论一般的链接器等用法,我不知道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运行时链接程序(动态加载程序)在搜索要加载到共享库中的共享库时要查找的位置。正在运行程序。

答案 1 :(得分:0)

原来是问题在于theano配置。声明CUDA_HOME(或CUDNN_HOME)的完整路径而不是使用$ CUDA_HOME(或$ CUDNN_HOME)解决了我的问题。

[cuda]
root=path/to/cuda/bin

[dnn]
include_path=path/to/cudnn/include
library_path=path/to/cudnn/lib64

P.S。管理员安装了Cudnn和Cuda模块,因此消除了一大麻烦。