`

Linux 共享库:尽量避免 LD_LIBRARY_PATH

阅读更多

Linux 运行的时候,是如何管理共享库(*.so)的?

 

在 Linux 下面,共享库的寻找和加载是由 /lib/ld.so 实现的。

 

ld.so 在标准路经(/lib, /usr/lib) 中寻找应用程序用到的共享库。

但是,如果需要用到的共享库在非标准路经,ld.so 怎么找到它呢?

目前,Linux 通用的做法是将非标准路经加入 /etc/ld.so.conf ,然后运行 ldconfig 生成 /etc/ld.so.cache

 

ld.so 加载共享库的时候,会从 ld.so.cache 查找。

传统上, Linux 的先辈 Unix 还有一个环境变量 - LD_LIBRARY_PATH 来处理非标准路经的共享库。ld.so 加载共享库的时候,也会查找这个变量所设置的路经。但是,有不少声音主张要避免使用 LD_LIBRARY_PATH 变量,尤其是作为全局变量。这些声音是:


* LD_LIBRARY_PATH is not the answer - http://prefetch.net/articles/linkers.badldlibrary.html
* Why LD_LIBRARY_PATH is bad           - http://xahlee.org/UnixResource_dir/_/ldpath.html
* LD_LIBRARY_PATH - just say no         - http://blogs.sun.com/rie/date/20040710


解决这一问题的另一方法是在编译的时候通过 -R<path> 选项指定 run-time path。

分享到:
评论

相关推荐

    ARM-linux(fedora)随笔

    `LD_LIBRARY_PATH`是一个环境变量,用于指示Linux动态链接器(`ld.so`)在哪里可以找到所需的共享库文件。它通常用于解决那些位于非标准路径下的共享库的查找问题。在嵌入式Linux开发环境中,这一点尤为重要,因为...

    LINUX下生成动态库.doc

    * LD_LIBRARY_PATH:环境变量,指示动态连接器可以装载动态库的路径 六、注意调用动态库时的问题 调用动态库时可能会遇到一些问题,例如: * 库文件找不到:可能是因为LD_LIBRARY_PATH环境变量没有设置正确 * 库...

    Linux下使用Java调用Hikvision设备网络SDK的使用指南.pdf

    - readme.txt文件:包含了设置环境变量的指导,即设置LD_LIBRARY_PATH环境变量,以便在系统中加载动态库。 4. 设置LD_LIBRARY_PATH环境变量的方法: - 直接在终端输入export命令,临时修改环境变量。 - 修改用户...

    库搜索路径 库搜索路径

    在Linux系统中,动态链接库(Dynamic Link Library,简称DLL,在Linux中通常称为共享库)是非常重要的组成部分。为了使程序能够找到并加载所需的动态链接库,系统提供了多种库搜索路径机制。本篇文章将详细探讨Linux...

    用于ubuntu16.04下安装mongodb时缺少的库文件

    echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64' | sudo tee -a /etc/profile source /etc/profile ``` 这样,系统在启动时会自动包含`/usr/lib64`路径。 6. **启动MongoDB服务**: 安装完成后,...

    Linux动态库.txt

    例如,可以通过命令 `export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib` 来添加 `/opt/lib` 路径。 - **/etc/ld.so.conf**:这是链接器和加载器搜索共享库时要检查的目录列表文件。可以通过编辑此文件来添加...

    使用LD_PRELOAD注入程序.pdf

    通常情况下,这一顺序为:LD_PRELOAD环境变量中指定的库,LD_LIBRARY_PATH指定的目录,ld.so.cache文件,系统的标准库目录/lib以及/usr/lib。通过LD_PRELOAD指定的库将优先加载,因此可以实现对程序行为的控制和修改...

    linux动态库的生成与使用

    * 使用 `LD_LIBRARY_PATH` 环境变量指定运行时的库路径,例如: ``` export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./main ``` * 使用 `/etc/ld.so.conf` 文件指定系统范围的库路径,例如: ``` /etc/ld.so.conf ``` ...

    Linux Shell脚本系列教程(四):使用函数添加环境变量.docx

    `LD_LIBRARY_PATH`环境变量则用来指定动态链接器在加载共享库时应搜索的额外目录。 **一、环境变量的基本概念** 1. **环境变量的作用**:环境变量通常用于存储路径列表,如`PATH`和`LD_LIBRARY_PATH`,它们定义了...

    在Linux中创建静态库和动态库

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. gcc -o hello main.c -L. -lmyhello ``` 执行程序时可能会遇到以下错误: ```bash ./hello: error while loading shared libraries: libmyhello.so: cannot open ...

    LINUX里面的环境变量的配置

    2. **LD_LIBRARY_PATH**: 指定了动态链接器(动态库加载器)搜索共享库的路径。这对于需要指定特定版本库的应用程序特别有用。 3. **HOME**: 指定用户的主目录路径。 4. **SHELL**: 指定用户的默认shell程序。 5. **...

    libfreetype.so.6

    可以临时通过`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library`添加,或者永久修改系统配置。 3. **软链接创建**:如果系统中存在更高版本的FreeType库,但不兼容程序,可以创建软链接。例如,如果系统...

    Dynamic_static_library_example.rar_Linux静态

    在Linux系统中,库是程序员共享代码的一种方式,它们分为动态库(Dynamic Library)和静态库(Static Library)。本文将详细介绍这两种库的创建方法,并通过示例帮助理解它们的工作原理和使用场景。 **动态库(.so ...

    Linux下使用动态库小结

    ### Linux下使用动态库... export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:tools/ ``` 以上就是关于Linux下动态库的基本使用和注意事项的总结。理解这些内容对于从事Linux开发尤其是嵌入式领域的开发者来说是非常有用的。

    linux_dongtai_lib.zip_linux 动态库

    - `LD_LIBRARY_PATH`环境变量:包含动态库的搜索路径。 - `/etc/ld.so.conf`文件:配置动态库的搜索路径。 - 动态链接器会按照上述顺序查找库。 7. **调试与问题解决** - `ldd`命令检查程序依赖的动态库是否...

    linux的ubuntu上如何编译C和C++代码写的动态库,以及调用执行

    echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:." &gt;&gt; ~/.bashrc source ~/.bashrc ``` 现在,你应该能够成功运行`mtest`了: ```bash ./mtest ``` 总结来说,创建和使用Linux Ubuntu上的C和C++动态库涉及编译...

    gdal_linux64版本库

    例如,如果库文件位于`/usr/local/lib`,可以运行`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib`。 4. 链接库文件:如果你是开发者,需要使用`gcc`或`g++`进行编译时,使用`-lgdal`选项链接GDAL库。 5...

    linux.o,.a,.so文件解析.pdf

    在使用动态链接库时,需要指定库的路径,可以使用 LD_LIBRARY_PATH 环境变量来指定库的路径。例如: export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH 这将告诉动态链接器在哪里可以找到共享库。 在编译和...

    linux安装oracle10g完整配置文档

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib export LD_LIBRARY_PATH CLASSPATH=$CLASSPATH:$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib ...

Global site tag (gtag.js) - Google Analytics