Linux系统库文件操作
库文件常见操作:
库文件问题分类: 缺&&失 位置原因 权限不当 版本匹配
库相关文件
/lib - 存放系统最基本的共享库,通常是链接到 /usr/lib 的符号链接。
/usr/lib - 存放大多数用户级别的共享库。
/usr/local/lib - 存放用户安装的库文件,特别是那些通过源代码编译安装的程序。
/usr/lib/x86_64-linux-gnu (或类似的路径,取决于架构和发行版) - 存放特定于架构的库文件。
/lib64 - 对于 64 位系统,存放 64 位架构的库文件。
/usr/lib64 - 对于基于 RPM 的系统(如 CentOS、Fedora、RHEL),存放 64 位架构的库文件。
// 在 /etc/ld.so.conf 和 /etc/ld.so.conf.d/ 文件添加/指定.so文件的位置所在,
// 需要使用 ldconfig 更新;
// export一个全局变量LD_LIBRARY_PATH,
// 然后运行程序的时候就会去这个目录中找library.(但其优先级是最高的).
查找命令/脚本运行时所需.so文件:
- 使用 ldd 命令:
格式为: ldd /path/to/executable
ldd /bin/ln
查找文件或命令:
-
使用whereis 命令:
whereis library_name -
使用which命令:
which library_name -
使用find 命令:
find / -name library_name -
使用locate 命令:
locate library_name -
使用ldconfig 命令:
ldconfig -p | grep library_name
检查环境变量LD_LIBRARY_PATH:
echo $LD_LIBRARY_PATH
查看动态连接器日志/var/log/ld.so.log:
cat /var/log/ld.so.log
将库文件放到能找到的位置!!!
如果: libblis.so.4安装在目录/usr/local/lib内,如何设置?
-
修改 环境变量: LD_LIBRARY_PATH
临时修改: export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
永久修改: 将上行指令添加到shell配置文件中,比如: ~/ .bashrc 或 ~/ .profile 中; -
更新 ld.so.cache
确保 /usr/local/lib 目录已经在/etc/ld.so.conf 或其 .d子目录中的某个配置文件中被列出。
运行命令 ld.so.cache 重建缓存:
ldconfig
如/usr/local/lib 未在/etc/ld.so.conf中列出,可如下操作:
echo '/usr/local/lib' | sudo tee -a /etc/ld.so.conf.d/local.conf
- 创建符号链接,将该链接放入标准库路径
如果libblis.so.4位于一个非标准位置,你可以考虑在标准库路径(如/usr/lib或/usr/lib64)中创建一个指向它的符号链接。
// 通常不推荐, 因为它可能干扰其他依赖相同库的软件包。
- 重新编译或安装软件包:
如果可能,你可以尝试重新编译或安装, 确保在编译时链接器能找到libblis.so.4。
这通常涉及到在编译命令中加入-L/usr/local/lib来指定库的搜索路径。
案例分析与处理:
缺失库文件
缺少库文件:
一个开发者尝试运行一个新安装的程序,但是程序无法启动,错误信息提示找不到 libmylib.so.1。
**解决过程: **
-
使用 ldd 命令检查程序依赖的库。
ldd /path/to/executable -
发现 libmylib.so.1 未被找到,使用 find 命令在系统中查找该库文件。
find / -name libmylib.so.1 -
如果找到了库文件,检查是否在 LD_LIBRARY_PATH 中。
如果不在,将库文件路径添加到 LD_LIBRARY_PATH 环境变量中。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib -
重新尝试运行程序。
版本不匹配:
程序在启动时提示 libmylib.so.1: version '1.2.3' not found。
解决过程:
-
使用 strings 命令检查已安装库文件的版本。
strings /path/to/libmylib.so.* | grep 'libmylib' -
确认版本不匹配后,查找并安装正确版本的库。
-
更新 LD_LIBRARY_PATH 环境变量,确保程序使用正确版本的库。
-
重新运行程序。
权限问题:
程序无法启动,错误信息显示 libmylib.so.1: cannot open shared object file: Permission denied。
-
检查库文件的权限设置。
ls -l /path/to/libmylib.so.1 -
如果权限设置不正确,使用 chmod 命令调整权限。
chmod 755 /path/to/libmylib.so.1 -
再次尝试运行程序。