你是否在 linux 系统上,运行程序的时候,遭遇过如下的提示信息:
error while loading shared libraries: lib*.so.*: cannot open shared object file: No such file or directory
这个提示信息的含义是系统找不到库文件lib*.so.*。系统默认查找库文件的目录是 /lib 和 /usr/lib 以及 /etc/ld.so.conf 文件中列出的目录和 /etc/ld.so.conf.d 目录下各.conf文件所列出的目录。ldconfig 的作用,就是在这些目录下,搜索出可共享的动态链接库(格式如 lib*.so.*,例 libcudart.so.4),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。
1. 如果往 /lib 和 /usr/lib 里面加入库文件,是不用修改 /etc/ld.so.conf 的,但是加入后要 root 用户执行一下 ldconfig 命令;
2. 如果库文件加入到 /lib 和 /usr/lib 以外的目录,那么要修改 /etc/ld.so.conf 文件或者在 /etc/ld.so.conf.d 目录下新建一个.conf 文件,然后再调用ldconfig。
例如:cuda 安装的是 5.5 版本,但是程序执行的时候要用到 libcudart.so.4,我们把 libcudart.so.4 文件放到 /home/tester/K20test 目录下,那么我们修改 /etc/ld.so.conf 文件,增加一行,内容为:“/home/test/K20test“即可。或者在 /etc/ld.so.conf.d 目录下新建文件 cudart4.conf,内容同样为:“/home/test/K20test“。然后一定记得执行 ldconfig。
3. 如果想在这两个目录以外放文件,但是又不想在/etc/ld.so.conf中加内容(或者是没有权限加内容),那么需要设定环境变量LD_LIBRARY_PATH,一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。
如上例,vi ~/.bashrc,增加如下内容:
LD_LIBRARY_PATH=/home/tester/K20test:$LD_LIBRARY_PATH
然后 source ~/.bashrc
特别提醒: ldconfig 做的这些操作都与运行程序有关,跟编译程序一点关系都没有。编译的时候还是该加 -L 就得加,不要混淆了。