链接私有库文件
原文地址: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文件
- 拷贝库文件到系统目录
# 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文件找到,还需要更新系统的链接表。
- 更新系统库的路径,使链接新的库生效。
# ldconfig
再次测试成功!
# ./test-bin-1.0.2
Version: 1.0.2
这里引申出问题,对系统来说,运行可执行文件后查找依赖库文件有一定的顺序。可以参考:makefile小白入门 - liqinglucky - 博客园 (cnblogs.com)
上面已经原理上验证可行后,可以更进一步。经常看到linux上软件编译安装都是用make install
的方法。我们也可以写一个makefile
,将拷贝库到系统目录自动化完成。
软件安装的实质就是将库文件,bin文件拷贝到对应的系统默认执行目录。
链接私有库的流程总结如下:
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