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配置的路径。
典型用途:
运行非标准位置的库文件
比如你安装了一个自定义版本的库在
/opt/mylibs下:1
2export LD_LIBRARY_PATH=/opt/mylibs:$LD_LIBRARY_PATH
./myapp
调试不同版本的库
- 临时切换库版本以验证兼容性。
不修改全局配置(如
/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出于安全考虑。
推荐的更安全替代方法:
使用
rpath或runpath在程序中嵌入路径(通过-Wl,-rpath,...):1
gcc main.c -o main -Wl,-rpath,/opt/mylibs -L/opt/mylibs -lmylib
设置
LD_RUN_PATH(编译时设置)1
2export LD_RUN_PATH=/opt/mylibs
gcc main.c -o main -L/opt/mylibs -lmylib使用 wrapper 脚本包装运行环境:
1
2
3
export LD_LIBRARY_PATH=/opt/mylibs:$LD_LIBRARY_PATH
exec ./myapp "$@"