# 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: ```bash patchelf --set-rpath "\$ORIGIN/../lib" ``` ## 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. 交叉编译