问题:在使用cuda的时候会出现 usr/bin/ld 找不到 -lcudart -lcurand
分析:程序在链接动态库的时候分为2步,编译时链接和运行时链接。
1,编译时链接
这个过程是由ld程序来执行的,这个过程严格意义上来说不能说是链接,在这里ld程序没有真正的把库里面的函数的执行代码写到可执行文件里面,只是把一些符号还有其他的必要信息写道了可执行文件里面,供可执行文件运行时查找。
总的来说,ld在这一步里面就是做了两个事情:
1. 查找动态库中是否含有我们需要的符号(函数和全局变量),如果都能找到,则链接允许通过,生成了可执行文件。
2. 在可执行文件中写入了符号和其他必要的信息(例如符号的地址),供可执行文件运行时查找。
2. 运行时链接
这个过程是由ld-linux.so程序来执行,这个才是真正的链接。它所做的工作就是将动态库的代码映射到进程(可执行文件运行起来就是进程啦...)的虚拟地址空间中,供进程来调用。
运行时,ld-linux.so查找共享库的顺序
(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看
(2)ld-linux.so.6缺省在/usr/lib和lib中搜索;当glibc安装到/usr/local下时,它查找/usr/local/lib
(3)LD_LIBRARY_PATH环境变量中所设定的路径
(4)/etc/ld.so.conf(或/usr/local/etc/ld.so.conf)中所指定的路径,由ldconfig生成二进制的ld.so.cache中
编译时,ld-linux.so查找共享库的顺序
(1)ld-linux.so.6由gcc的spec文件中所设定
(2)gcc --print-search-dirs所打印出的路径,主要是libgcc_s.so等库。可以通过GCC_EXEC_PREFIX来设定
(3)LIBRARY_PATH环境变量中所设定的路径,或编译的命令行中指定的-L/usr/local/lib
(4)binutils中的ld所设定的缺省搜索路径顺序,编译binutils时指定。(可以通过“ld --verbose | grep SEARCH”来查看)
(5)二进制程序的搜索路径顺序为PATH环境变量中所设定。一般/usr/local/bin高于/usr/bin
(6)编译时的头文件的搜索路径顺序,与library的查找顺序类似。一般/usr/local/include高于/usr/include
解决:首先在~/.bashrc中查看LD_LIBRARY_PATH中是否包含libcudart.so所在路径,查看libcudart.so链接是否有效,
我的
~/.bashrc配置:
export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
export PATH=${CUDA_HOME}/bin:${PATH}
配置以及路径没问题,so文件也存在,仍然报错找不到,添加软链接就好了
sudo
ln -s
/usr/
local/cuda/lib64/libcudart.so
/usr/lib
/libcudart.so
sudo ln -s
/usr/
local/cuda/lib64/libcurand.so
/usr/lib
/libcurand.so