Ubuntu的.so文件问题

前言

昨天在anaconda的虚拟环境py3 下装uwsgi

但执行uwsgi命令的时候报错提示:
uwsgi: error while loading shared libraries: libpcre.so.1: cannot open…

找不到libpcre.so.1 这个动态链接库。

这个东西叫做 动态链接库。

  • An .so file is a compiled library file. It stands for “Shared Object” and is analogous to a Windows DLL

正文

首先我学习了几个linux命令:

  1. ldd命令用于打印程序或者库文件所依赖的共享库列表。
    2.ldconfig命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib.so),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。
    3.locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。
1
2
3
4
5
6
7
ldconfig /opt/anaconda3/lib/
ldd /data/software/anaconda2/bin/uwsgi
locate libcrypto.so.1.0.0
libcrypto.so.1.0.0 => /data/software/anaconda2/lib/libcrypto.so.1.0.0的 (0x00007f90b5695000)
表示libcrypto.so.1.0.0 用的是 /data/software/anaconda2/lib/libcrypto.so.1.0.0的 动态 链接库
用locate libcrypto.so.1.0.0 查看系统一共有几个 libcrypto.so.1.0.0 动态链接库

ldconfig的几点注意事项:

  1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到。
  2. 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到。
  3. 比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后ldconfig一下,新的library才能在程序运行时被找到。
  4. 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用

in my case:

1
2
3
4
add the line below in /etc/profile:
export LD_LIBRARY_PATH=/data/software/anaconda2/lib
ldconfig /lib/x86_64-linux-gnu/

finished!

另外 LD_LIBRARY_PATH的优先级是最高的。

The order is documented in the manual of the dynamic linker, which is ld.so. It is:

  1. directories from LD_LIBRARY_PATH;
  2. directories from /etc/ld.so.conf;
  3. /lib;
  4. /usr/lib.
    (I’m simplifying a little, see the manual for the full details.)
1
2
3
4
The order makes sense when you consider that it's the only way to override a library in a default location with a custom library.
LD_LIBRARY_PATH is a user setting, it has to come before the others. /etc/ld.so.conf is a local setting, it comes before the operating system default.
So as a user, if I want to run a program with a different version of a library, I can run the program with LD_LIBRARY_PATH containing the location of that different library version.
And as an administrator, I can put a different version of the library in /usr/local/lib and list /usr/local/lib in /etc/ld.so.conf.