0x00

很多情况下编译完成或者安装完成的程序运行时都会遇到难以避免的问题:“error while loading shared libraries: libevent-2.1.so.7: cannot open shared object file: No such file or directory” ,新手往往难以定位程序在加载时到底在哪个位置寻找了这些动态库。

0x01

以Transmission所需的其中一个库libevent-2.1.so.7为例。

定位所需库文件的路径

find / - name libevent-2.1.so.7 2>/dev/null
    /usr/local/x86_64-gnu-linux/libevent-2.1.so.7
user@Linux:~$

系统给出了libevent-2.1.so.7这个文件所在的路径,由此可见系统内是安装了这个库的,但是为什么依然提示找不到这个库呢?这个时候就要深入调查了。

0x02

使用DEUBG模式回显程序加载内容

LD_DEUBG=libs transmission-daemon 

    ......
      2186:   trying file=/lib/tls/x86_64/libevent-2.1.so.7
      2186:   trying file=/lib/tls/x86_64/libevent-2.1.so.7
      2186:   trying file=/lib/tls/libevent-2.1.so.7
      2186:   trying file=/lib/x86_64/x86_64/libevent-2.1.so.7
      2186:   trying file=/lib/x86_64/libevent-2.1.so.7
      2186:   trying file=/lib/x86_64/libevent-2.1.so.7
      2186:   trying file=/lib/libevent-2.1.so.7
      2186:   trying file=/usr/lib/tls/x86_64/x86_64/libevent-2.1.so.7
      2186:   trying file=/usr/lib/tls/x86_64/libevent-2.1.so.7
      2186:   trying file=/usr/lib/tls/x86_64/libevent-2.1.so.7
      2186:   trying file=/usr/lib/tls/libevent-2.1.so.7
      2186:   trying file=/usr/lib/x86_64/x86_64/libevent-2.1.so.7
      2186:   trying file=/usr/lib/x86_64/libevent-2.1.so.7
      2186:   trying file=/usr/lib/x86_64/libevent-2.1.so.7
      2186:   trying file=/usr/lib/libevent-2.1.so.7
      2186:
    /opt/transmission/bin/transmission-daemon: error while loading shared libraries: libevent-2.1.so.7: cannot open shared object file: No such file or directory

不难发现,程序在编译过程中在上述的目录下寻找了“libevent-2.1.so.7”这个库文件,唯独没有在“/usr/local/x86_64-gnu-linux/”这个路径下搜索。

于是尝试均失败后,报出了错误。

我们接下来要做的就是为动态库创建软连接。

0x03

sudo ln -s /usr/lib/x86_64-linux-gnu/libevent-2.1.so.6 /usr/lib/libevent-2.1.so.7

重新运行程序,无报错。

抛砖引玉,日后遇到相同类似的错误都可以参考这个思路解决,而不用盲目安装各种各样的包来尝试。