例子
例如需要编译cu时,需要-lcudart,编译命令中要加入 -L/data/cuda/cuda-10.2/cuda/lib64 -lcudart
编译成功:
如果去掉-L/data/cuda/cuda-10.2/cuda/lib64
这是因为没有在默认的动态链接库目录中找到cudart.so
根据https://www.cnblogs.com/zhouhbing/p/5109750.html的内容,新增加的so目录可以通过两种方式加入搜索目录。
- 将新的so目录写入/etc/ld.so.conf,然后再调用ldconfig
- 将新的so目录写入环境变量LD_LIBRARY_PATH
先尝试第二种方法:
- 确认cuda/lib64已经写入LD_LIBRARY_PATH
- source 环境变量
- ldconfig -v,结果如下
- make
仍然找不到,看一下lib64目录中的so
这个libcudart.so已经连接上了libcudart.so.10.2
再看一下ldconfig的cache
也已经写好了cudart.so
奇怪了,难道是driver和toolkit版本不对应导致的?
driver版本:
但是toolkit版本定义的是10.2,所有有可能是driver自动去10.2的目录找11.2的so找不到?
重新安装cuda11.2的toolkit后,检查ldconfig
两个问题:cudart.so的路径有两个,要把10.2去掉,保证链接到11.2;11.2的路径不是期望的路径
看一下ldconfig的搜索路径
看来设置了LD_LIBRARY_PATH仍然没有改掉ldconfig的搜索路径,自己改一下吧
sudo vi /etc/ld.so.conf
,改完了:
之后ldconfig一下,再看一下cudart的链接
再make
心态崩了,老老实实-L吧
我居然知道为啥了
make出错的命令是g++的
其原因是:
https://stackoverflow.com/questions/4250624/ld-library-path-vs-library-path
https://www.cnblogs.com/panfeng412/archive/2011/10/20/library_path-and-ld_library_path.html
因为g++这条命令是在使用host linker完成device的重定位目标文件和host的重定位目标文件link起来,所以需要的是LIBRARY_PATH路径
只有编译、链接都完成的时候,加载so使用的是LD_LIBRARY_PATH
所以在环境变量中增加一下
再make