链接私有库文件

发布时间 2023-11-24 09:49:38作者: liqinglucky

原文地址:https://www.cnblogs.com/liqinglucky/p/link-libso.html

当我们自己编译了个bin文件,这个文件运行依赖自己编译的私有库。在没有做链接的情况,直接运行bin文件会报错

# ./test-bin-1.0.1
./test-bin-1.0.1: error while loading shared libraries: libtest.so.1.0.1: cannot open shared object file: No such file or directory

报错原因:找不到库文件。

一、指定私有库链接

接下来的问题便是如何将bin文件与私有库链接起来。

1 指定私有库路径

原理可以参考gcc指定库路径的方法:makefile小白入门 - liqinglucky - 博客园 (cnblogs.com)

演示的文件目录如下

# tree
.
├── libtest.so             <<< 私有库文件
└── test-bin-1.0.1         <<< bin文件

最简单的就是指定成当前目录。设置如下:

export LD_LIBRARY_PATH=libary:.

如果是依赖库名是libtest.so.1.0.1,但我们编译出来的库文件名是libtest.so。那还需建立软链接。

ln -sfn libtest.so libtest.so.1.0.1

2 私有库加入系统库目录

上面的方法,私有库只能给自己的bin文件使用。更通用的应该是将私有库做成系统链接库,这样后面只要系统的bin文件需要都可以用上这个私有库。
演示的文件目录如下:

# tree
.
├── /usr/local/lib/libtest.so.1.0.2       <<< 私有库文件自带版本号,这样就可以区分不同的库版本
└── /root/test-bin-1.0.2                  <<< bin文件
  1. 拷贝库文件到系统目录
# cp libtest.so.1.0.2 /usr/local/lib/

但此时bin文件还不能链接到私有库文件。直接运行还是报错。

# ./test-bin-1.0.2
./test-bin-1.0.2: error while loading shared libraries: libtest.so.1.0.2: cannot open shared object file: No such file or directory

说明单纯把库文件放到系统目录并不能马上让bin文件找到,还需要更新系统的链接表。

  1. 更新系统库的路径,使链接新的库生效。
# ldconfig

再次测试成功!

# ./test-bin-1.0.2
Version: 1.0.2

这里引申出问题,对系统来说,运行可执行文件后查找依赖库文件有一定的顺序。可以参考:makefile小白入门 - liqinglucky - 博客园 (cnblogs.com)

上面已经原理上验证可行后,可以更进一步。经常看到linux上软件编译安装都是用make install软件安装的实质就是将库文件,bin文件拷贝到对应的系统默认执行目录。
我们也可以写一个makefile,将拷贝库到系统目录自动化完成。
链接私有库的流程总结如下:

3 遇到过的问题

直接用带版本号的库文件做链接时有提示

# ldconfig
/sbin/ldconfig.real: /usr/local/lib/libtest.so.1.0.1 is not a symbolic link
/sbin/ldconfig.real: /usr/local/lib/libtest.so.1.0.2 is not a symbolic link

解决方法:
Linux 提示 is not a symbolic link 错误解决方法 - 白菜没我白 - 博客园 (cnblogs.com)
因为libtest.so.1.0.1正常情况下应该是一个符号链接,而不是实体文集件,修改其为符号链接即可。
进入 root 用户后,执行重新赋予软链接即可,如下

ln -sf libtest.so.1.0.1 libtest.so