Linux 库文件说明
1、库文件的类型
Linux 中的库文件本质上就是封装好的功能模块,某个应用程序如果要实现某个功能,只需要调用现有库文件就可以直接使用,这样就避免了重复开发。Linux 中的库文件分为两种类型:
- 静态库:以
.a
结尾。程序编译时,编译器会把需要的函数代码直接复制进可执行文件。所以程序编译完成后,静态库不存在不影响程序运行。 - 动态库:以
.so
结尾。程序编译时,编译器只记录一个引用,程序运行时才通过动态链接器加载对应的.so
文件,后续程序运行时需要保证动态库能被找到。
2、库文件存储路径
路径 | 用途说明 |
---|---|
/lib 、/lib64 | 存放操作系统引导和基本运行时所需的共享库 |
/usr/lib、/usr/lib64 | 存放通过包管理器(如 apt、yum)安装的软件的库文件 |
/usr/local/lib | 存放用户通过源码编译安装的软件所使用的库 |
自定义路径 | 存放特定工程项目的私有库文件。 |
3、库文件查找顺序
Linux 中某个应用进程运行时加载动态库时,实际是通过 动态链接器 来实现库的查找和加载,动态链接器 会按照一下的顺序来查找库文件。
查找顺序 | 查找方式 | 说明 |
---|---|---|
① | 编译时 指定的路径 | 如果编译时制定了查找库文件的路径,会从指定的路径下查找 |
② | 环境变量 LD_LIBRARY_PATH |
用于临时指定优先搜索的库路径,开发和调试常用,一般为空。 |
③ | 系统库缓存 /etc/ld.so.cache |
由 ldconfig 命令生成,记录常用库路径,会从这里面指定的路径查找库文件 |
④ | 默认路径/lib , /lib64 , /usr/lib |
由动态链接器写死(内置)的默认库查找路径 |
Linux 库文件管理
1、查看动态库相关信息
查看 动态链接器写死(内置)的默认库查找路径:
ld --verbose | grep SEARCH_DIR
查看硬盘上是否存在对应的库文件
# ldconfig -v 是显示所有已经存在在硬盘上的库文件,不管是否被加载
sudo ldconfig -v | grep name
查看某个库文件是否已经被系统加载
# ldconfig -p 显示的是所有已被系统动态链接器“识别并缓存”的动态库文件
sudo ldconfig -p | grep name
查看一个可执行程序运行时会使用哪些 动态链接库(.so),以及是否正常加载
ldd /path
有 => 指向路径
:表示动态链接器在磁盘上找到了对应的库文件无 => 指向路径
:是虚拟动态共享对象,内核提供,不是实际的磁盘文件输出中包含=> not found
:表示找不到该动态库,程序运行时会报错
例如:查看 ls
会使用哪些动态库文件:
root@ubuntu:~# ldd /usr/bin/ls
linux-vdso.so.1 (0x00007ffee1127000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fe20f017000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe20ee25000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007fe20ed94000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe20ed8e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe20f07e000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe20ed6b000)
2、添加动态库查找路径
除了 由动态链接器写死(内置)的默认库查找路径外,还可以通过 ldconfig
来指定应用程序查找共享库的路径:
(1)将库路径写入配置文件 /etc/ld.so.conf
或 /etc/ld.so.conf.d/*.conf
例如:
/usr/local/python3/lib
/usr/local/ffmpeg/lib
(2)执行 ldconfig
命令,生成或更新 /etc/ld.so.cache
,这样系统就能通过缓存文件 /etc/ld.so.cache
快速查找到动态库。
sudo ldconfig