问题源于一次深度学习框架安装

pacman -S cuda cudnn

通过命令安装好以后,cmake编译时报错

-- Caffe2: CUDA detected: 10.1<br>
-- Caffe2: CUDA nvcc is: /opt/cuda/bin/nvcc<br>
-- Caffe2: CUDA toolkit directory: /opt/cuda<br>
-- Caffe2: Header version is: 10.1<br>
-- Could NOT find CUDNN (missing: CUDNN_INCLUDE_DIR CUDNN_LIBRARY) 

查看报错信息是找不到cudnn_include_dir和cudnn_library这两个系统环境变量

简单在env.cmake设置下环境变量

set(CUDNN_INCLUDE_DIR "/usr/include")
set(CUDNN_LIBRARY "/usr/lib")

这样就能覆盖系统变量,让cmake识别到cudnn

随后编译时继续报错

make[2]: *** 没有规则可制作目标“/usr/local/cuda/lib64/libnvToolsExt.so”,由“/home/xxx/xxx/target.so” 需求。 停止。
make[1]: *** [CMakeFiles/Makefile2:73:CMakeFiles/LibDL.core.dir/all] 错误 2

查看了下,在ArchLinux安装的/opt/cuda目录下是存在这个文件的,但是cmake查找,或者说编译的时候查找到了/usr/local/目录下去
推测是cmake自带的FindXXX.cmake文件参照的路径并不是系统环境变量下的cuda安装路径,而是写死的查找(对arch用户很不友好

手动在/usr/local加上符号链接。继续编译发现还有报错

cd /usr/local
sudo ln -s /opt/cuda
/bin/ld: /usr/lib: file not recognized: 是一个目录
collect2: 错误:ld 返回 1<br> make[2]: *** [CMakeFiles/LibDL.core.dir/build.make:342:/path/to/target/libLibDL.core.so] 错误 1
make[1]: *** [CMakeFiles/Makefile2:73:CMakeFiles/LibDL.core.dir/all] 错误 2
make: *** [Makefile:84:all] 错误 2

发现是CUDNN_LIBRARY的问题,环境变量中设置成了目录,导致连接器找不到文件。
实际上在FindCudnn.cmake中,他以目录的方式在搜索。所以一开始的时候cmake能生成makefile。
然而链接器这里需要输入的是文件,所以最后编译是失败。

set(CUDNN_LIBRARY "/usr/lib/libcudnn.so")

改成如上所示即可。

分类: Linux

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注