linux下搜索共享库环境变了LD_LIBRARY_PATH

LD_LIBRARY_PATH 是 Linux 下一个非常重要的环境变量,它指定动态链接器(dynamic linker)在运行时搜索共享库(.so 文件)的路径。


基本定义:

1
export LD_LIBRARY_PATH=/your/lib/path:$LD_LIBRARY_PATH
  • 它告诉系统:在默认系统路径(如 /lib, /usr/lib)之外,也去指定路径找 .so 动态链接库。
  • 使用时优先于 /etc/ld.so.conf 配置的路径。

典型用途:

  1. 运行非标准位置的库文件

    • 比如你安装了一个自定义版本的库在 /opt/mylibs 下:

      1
      2
      export LD_LIBRARY_PATH=/opt/mylibs:$LD_LIBRARY_PATH
      ./myapp
  2. 调试不同版本的库

    • 临时切换库版本以验证兼容性。
  3. 不修改全局配置(如 /etc/ld.so.conf/etc/ld.so.conf.d/xxx.conf

    • 不影响系统其他程序。

与静态链接的区别:

  • LD_LIBRARY_PATH运行时(runtime) 动态链接使用的;

  • 编译时使用的是 -L(指定库路径)和 -l(链接库)参数;

    1
    gcc -L/custom/lib -lmylib main.c -o main

注意事项:

  • **不要在系统全局环境中长期设置 LD_LIBRARY_PATH**(如 .bashrc 中),会引发冲突或不稳定。
  • 它会 覆盖系统默认路径的优先级,可能会加载到错误的库版本,尤其是系统程序。
  • 某些 suid 程序会忽略 LD_LIBRARY_PATH 出于安全考虑。

推荐的更安全替代方法:

  1. 使用 rpathrunpath 在程序中嵌入路径(通过 -Wl,-rpath,...):

    1
    gcc main.c -o main -Wl,-rpath,/opt/mylibs -L/opt/mylibs -lmylib
  2. 设置 LD_RUN_PATH(编译时设置)

    1
    2
    export LD_RUN_PATH=/opt/mylibs
    gcc main.c -o main -L/opt/mylibs -lmylib
  3. 使用 wrapper 脚本包装运行环境:

    1
    2
    3
    #!/bin/bash
    export LD_LIBRARY_PATH=/opt/mylibs:$LD_LIBRARY_PATH
    exec ./myapp "$@"