2021-10-16 17:50:51 +08:00
|
|
|
|
# Linux Lib 库说明
|
|
|
|
|
|
|
|
|
|
## 搜索优先级
|
|
|
|
|
|
|
|
|
|
Linux 系统和 Windows 系统实现动态链接的方式有差别。Linux 系统对可执行程序执行动态链接会到固定的路径去查找,查找顺序如下:
|
|
|
|
|
|
|
|
|
|
* RUNPATH:如果系统支持该设定,则会在 RUNPATH 设置情况下自动忽略 RPATH,先去寻找 LD_LIBRARY_PATH 之后再去找 RUNPATH。
|
|
|
|
|
* RPATH
|
|
|
|
|
* LD_LIBRARY_PATH
|
|
|
|
|
* /lib,/usr/lib 等通过 /etc/ld.so.conf 配置的路径
|
|
|
|
|
|
|
|
|
|
编译期对 Lib 库搜索路径的影响主要在 RPATH 的设定上。
|
|
|
|
|
|
|
|
|
|
## 增加/修改系统 Lib 库索引路径
|
|
|
|
|
|
|
|
|
|
* 修改 /etc/ld.so.conf,然后执行 ldconfig -v 命令使其生效,Linux 发行版的 ld.so.conf 可能会用 include 命令进行配置“include /etc/ld.so.conf.d/*.conf”,那么这样也可以在“/etc/ld.so.conf.d”新建一个以“.conf”结尾的文件,并把自定义的 Lib 库搜索路径写在里面。
|
|
|
|
|
* 修改 LD_LIBRARY_PATH。
|
|
|
|
|
|
2021-10-16 18:29:04 +08:00
|
|
|
|
## RPATH
|
|
|
|
|
|
|
|
|
|
可执行文件创建后可通过 patchelf 修改 RPATH:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
patchelf --set-rpath "\$ORIGIN/../lib" <exec file>
|
|
|
|
|
```
|
|
|
|
|
|
2021-10-16 17:50:51 +08:00
|
|
|
|
## GCC 与 Lib 库索引路径
|
|
|
|
|
|
|
|
|
|
可在编译程序时指定 -rpath/-rpath-link 参数来设定/修改 RPATH。
|
|
|
|
|
|
|
|
|
|
## CMake 与 Lib 库索引路径
|
|
|
|
|
|
|
|
|
|
CMake 对于 RPATH 的管理也非常人性化,当动态库的编译也和执行档在同级目录下的时候,CMake 会自动给执行档加入适当的 RPATH。
|
|
|
|
|
|
|
|
|
|
CMake 里面维护了 4 个比较重要的 RPATH 变量,即 CMAKE_SKIP_RPATH、CMAKE_SKIP_BUILD_RPATH 和 CMKAE_INSTALL_RPATH、CMAKE_BUILD_WITH_INSTALL_RPATH。
|
|
|
|
|
|
|
|
|
|
## 内部参考关键字
|
|
|
|
|
|
|
|
|
|
1. ldconfig
|
|
|
|
|
2. GCC 参数
|
|
|
|
|
3. 常用宏
|
2021-10-16 18:29:04 +08:00
|
|
|
|
4. 交叉编译
|