1.6 KiB
1.6 KiB
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。
RPATH
可执行文件创建后可通过 patchelf 修改 RPATH:
patchelf --set-rpath "\$ORIGIN/../lib" <exec file>
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。
内部参考关键字
- ldconfig
- GCC 参数
- 常用宏
- 交叉编译