`

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。

分享到:
评论

相关推荐

    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 ...

    linux 静态库的使用

    此时就需要系统动态载入器(dynamic linker/loader)对于 `elf` 格式的可执行程序,是由 `ld-linux.so*` 来完成的,它先后搜索 `elf` 文件的 `DT_RPATH` 段—环境变量 `LD_LIBRARY_PATH`— `/etc/ld.so.cache` 文件...

    为Linux应用程序编写DLL程序函数

    在运行时,主应用程序使用绝对路径或相对于 LD_LIBRARY_PATH 的相对路径找到共享目标库,并且请求所需的 dll 入口点的地址。当需要时,也可对 dll 进行间接函数调用,最后,关闭到共享目标文件的句柄,并且从内存中...

    在Delphi for Linux中应用共享对象库.pdf

    * 设置环境变量LD_LIBRARY_PATH * 设置系统库文件的路径 * 设置动态链接库的搜索路径 七、在Delphi for Linux中用隐式或显式链接方法装入和使用SO函数 在Delphi for Linux中,可以使用隐式或显式链接方法装入和...

    linux C 动态库和静态库生成及使用笔记

    我们可以将我们自己的库文件添加到系统库文件的存储目录中,或者使用环境变量 LD_LIBRARY_PATH,将我们自己的库文件的路径配置到该变量中。 二、静态库生成和使用 静态库是一种在编译时被复制到程序中的库文件。...

    Linux系统中如何添加自己的库文件路径

    库文件在连接(静态库和共享库)和运行(于使用共享... 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。  2. 在 /etc/ld.so.conf 文件中添加库的搜索路径。  将自己可能存放库文件的路径都加入到/etc/ld.so.conf中

    隐式格式的MATLAB代码-matlab-covertree:允许从MATLAB创建和操作CoverTree数据结构的类

    隐式格式的MATLAB代码封面树的MATLAB绑定 描述 这是John Langford制作的Cover Tree实现的MATLAB绑定,.../')添加到LD_LIBRARY_PATH环境变量中: setenv('LD_LIBRARY_PATH', [getenv('LD_LIBRARY_PATH') '/usr/lib/']);

    liblsoda:LSODA算法作为共享库用于微分方程

    利比苏达 这是一个C库,实现了Linda Petzold和Alan Hindmarsh的LSODA算法,该算法解决了一阶常微分方程的刚性或非...export LD_LIBRARY_PATH=../src:$LD_LIBRARY_PATH ./test 这应该给出以下内容。 at t= 4.0000e-

    虚拟机搭建caffe1

    使用以下命令将环境变量添加到 .bashrc 文件中:export CUDA_HOME=/usr/local/cuda-7.0 && export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH && PATH=$CUDA_HOME/bin:$PATH && export PATH。 CUDA Sample...

    linux静态链接库与动态链接库的区别及动态库的创建借鉴.pdf

    setenv LD_LIBRARY_PATH your/full/path/to/dll ``` 五、结语 动态链接库可以实现进程之间的资源共享,节省系统的内存资源,并使程序升级变得简单。但是,动态链接库的创建和使用需要注意一些编译参数和环境变量的...

    嵌入式系统/ARM技术中的Linux下动态共享库加载时的搜索路径详解

    对动态库的实际应用还不太熟悉的读者可能曾经遇到过类似“error while loading shared libraries”这样的错误,这是典型的因为需要的动态库不在动态...环境变量LD_LIBRARY_PATH指定的动态库搜索路径;  3./etc/ld.

    详解Linux动态库生成与使用指南

    Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。 在链接动态库生成可执行文件时,并不会把动态库的... 把libxxx.so放入链接库的标准路径,或指定 LD_LIBRARY_PATH,

    iup:通用Lisp CFFI绑定到IUP便携式用户界面库(ALPHA之前的版本)

    通常,这意味着在Linux上设置LD_LIBRARY_PATH或在Windows上设置PATH 。 但是,有一个可用于自动下载和安装用于x86 / 64位Linux和Windows的Tecgraf IUP,CD和IM共享库: (ql:quickload " tecgraf-libs " ) 这将根据...

    UELinuxNativeDialogs:专用于虚幻引擎的 Linux 文件对话框实现

    或者,可以执行普通链接并使用LD_LIBRARY_PATH选择所需的实现。 执照 麻省理工学院许可证 (MIT) 版权所有 (c) 2014 Code Charm Ltd 如果您需要任何特殊许可,请联系 RushPL #ue4linux @ irc.freenode.net 或

    ftd2xx:围绕FTDI D2XX的Python库。 寻找新的维护者

    请确保已安装FTDI驱动程序,或在链接程序用于查找共享库的位置可用(例如Windows上的PATH,LD_LIBRARY_PATH或Linux上的标准库目录) 我没有时间维护这个项目,所以我正在寻找维护者。 还提供了另一个库,该库看...

    UC编程技术总结UC编程技术总结

    使用共享库时,需要将共享库文件连接到可执行文件中,并将共享库文件的路径配置到环境变量LD_LIBRARY_PATH中。 二、内存管理 内存管理是编程中非常重要的一方面。new 和 delete 是两种不同的内存管理方式。new 会...

    RBBComp:bbcomp 的非官方 R 绑定(黑盒优化竞赛 - http

    将 RProxy.so、libbbcomp.so(从下载用于您自己架构的二进制文件)和 RBBComp.r 放在您的 LD_LIBRARY_PATH 中。 以 C 的 bbcomp 官方文档中描述的方式使用 RRBComp.r API。请注意,您可以传递包含多个点的矩阵,以...

    操作系统(内存管理)

    文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...

Global site tag (gtag.js) - Google Analytics