ldconfig

例子

例如需要编译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目录可以通过两种方式加入搜索目录。

  1. 将新的so目录写入/etc/ld.so.conf,然后再调用ldconfig
  2. 将新的so目录写入环境变量LD_LIBRARY_PATH

先尝试第二种方法:

  1. 确认cuda/lib64已经写入LD_LIBRARY_PATH
  2. source 环境变量
  3. ldconfig -v,结果如下
  4. 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

posted @ 2022-04-16 11:55  ijpq  阅读(93)  评论(0编辑  收藏  举报