NotePublic/Software/Development/System/Linux/User/Linux_Lib_库说明.md

1.6 KiB
Raw Blame History

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。

内部参考关键字

  1. ldconfig
  2. GCC 参数
  3. 常用宏
  4. 交叉编译