• 那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻:1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L);example: gcc -Wl,-rpath,/home/...

    那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻:

    1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L);

    example: gcc -Wl,-rpath,/home/arc/test,-rpath,/lib/,-rpath,/usr/lib/,-rpath,/usr/local/lib test.c

    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;(export LD_LIBRARY_PATH=/root/test/env/lib)

    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;(更改/etc/ld.so.conf文件后记得一定要执行命令:ldconfig!该命令会将/etc/ld.so.conf文件中所有路径下的库载入内存中)

    4.默认的动态库搜索路径/lib;

    5.默认的动态库搜索路径/usr/lib。


    在命令前加环境变量设置,该环境变量只对该命令有效,当该命令执行完成后,该环境变量就无效了。如下述命令:# LD_LIBRARY_PATH=/root/test/env/lib ./pos


    下面对编译时库的查找与运行时库的查找做一个简单的比较:

    1. 编译时查找的是静态库或动态库,而运行时,查找的只是动态库。

    2. 编译时可以用-L指定查找路径,或者用环境变量LIBRARY_PATH,而运行时可以用-Wl,rpath或-R选项,或者修改/etc/ld.so.conf文件或者设置环境变量LD_LIBRARY_PATH.

    3. 编译时用的链接器是ld,而运行时用的链接器是/lib/ld-linux.so.2.

    4. 编译时与运行时都会查找默认路径:/lib  /usr/lib

    5. 编译时还有一个默认路径:/usr/local/lib,而运行时不会默认找查该路径。

    展开全文
  • linux上配置caffe上经常会遇到各种错误,其中就包括ld error,即链接库无法找到之类的错误,因此在这里总结一下linux动态库搜索路径的配置。 动态链接库 动态链接库是程序运行时需要加载的库,类似windows里的...

    在linux上配置caffe上经常会遇到各种错误,其中就包括ld error,即链接库无法找到之类的错误,因此在这里总结一下linux动态库搜索路径的配置。

    动态链接库

    动态链接库是程序运行时需要加载的库,类似windows里的dll,常以.so结尾,里面打包了c/c++程序的一些具体实现。
    当我们运行某个程序需要依赖某个动态库时,就需要给程序指定该动态库的路径。

    动态库路径

    动态库的搜索路径可以通过以下方式配置:

    1. 根据LD_LIBRARY_PATH这个环境变量来找,可以通过在~/.bashrc中加入export LD_LIBRARY_PATH=/XXX:$LD_LIBRARY_PATH来配置该环境变量,然后用source ~/.bashrc使其生效。
    2. 更改配置文件/etc/ld.so.conf,加入搜索路径。
    3. 进到/etc/ld.so.conf.d/目录下,会有很多*.conf文件,可以加入自定义的.conf文件来配置搜索路径,比如opencv的配置文件opencv.conf中加入/usr/local/lib,让系统在该路径下去找opencv的libraries (libopencv*.so*)。

    链接错误解决方法

    如果遇到ld错误,说找不到某某库文件 (.so),则需先在系统中搜索该库文件是否存在,用locate libxxx.so。若存在,则是因为系统找不到该库文件,需要按照上述方式手动添加;若不存在,则可用apt-get安装库或者下载源码libxxx.tar.gz自行编译。
    (先写到这里吧,后续有再补充…)

    展开全文
  • Linux动态链接库搜索路径 2011-06-30 11:43:59 分类: LINUX  编译程序时如果程序依赖的动态链接库没有安装在系统标准路径:/lib/或/usr/lib程序运行时往往提示找不到相应的动态链接库文件无法执行,原因...
    
    

    分类: LINUX

      编译程序时如果程序依赖的动态链接库没有安装在系统标准路径:/lib/或/usr/lib程序运行时往往提示找不到相应的动态链接库文件无法执行,原因就在于动态链接加载器ld的搜索路径列表里没有你的库安装路径。

             Linux动态链接库的搜索路径按优先级排序为:

    1.编译目标代码时指定的动态库搜索路径;

    在编译时通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔。

    2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

    3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

         /etc/ld.so.conf的第一行有个引用命令:include ld.so.conf.d/*.conf

         因此,最优雅的方式是在ld.so.conf.d目录下创建一个你的程序依赖的配置文件,配置文件内容为程序依赖的动态链接库的路径,一个路径一行。

         添加完配置文件后执行ldconfig使其生效。

    4.默认的动态库搜索路径/lib;

    5.默认的动态库搜索路径/usr/lib;

     

    Linux动态链接库有很多相关命令,在此记录下最常用的几个分析命令:

    ldd: 查看可执行程序依赖的动态链接库符号,以及引用路径

    readelf: 查看可执行程序的ELF头信息,包括动态链接库符号

    ldconfig: 加载动态链接库搜索路径

     

    可以参考的文章:
    1、Linux 动态库剖析http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/
    2、剖析共享程序库http://www.ibm.com/developerworks/cn/linux/l-shlibs.html

    3、ldd命令的原理与使用方法http://hi.baidu.com/wstone_h/blog/item/af67700a80a01e1594ca6b29.html

    展开全文
  • 1 2 ...export LD_LIBRARY_PATH=你的路径:$LD_...linux 默认回去/lib和/usr/lib目录下查找,可以通过ln建立软连接   转: 1. 连接和运行时文件搜索路径到设置 文件在连接(静态和共享
    1
    2
    export LD_LIBRARY_PATH=你的库的路径:$LD_LIBRARY_PATH
    echo $LD_LIBRARY_PATH

    linux 默认回去/lib和/usr/lib目录下查找库,可以通过ln建立软连接

     

    转:

    1. 连接和运行时库文件搜索路径到设置

    库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:

     

    (1). 在 /etc/ld.so.conf 文件中添加库的搜索路径。(或者在/etc/ld.so.conf.d 下新建一个.conf文件,将搜索路径一行一个加入-junziyang)

    将自己可能存放库文件的路径都加入到/etc /ld.so.conf中是明智的选择添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:

    1
    2
    3
    /usr/X11R6/lib
    /usr/local/lib
    /opt/lib

      需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。

     因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache 以供使用。因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下 /sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。

     在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。 

    这种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令。而且,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK+ 库。不幸的是,由于 GTK+ 版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在 GTK+ 及其依赖库的安装过程中对于库的搜索路径的设置将采用另一种方式进行。这种设置方式不需要 root 权限,设置也简单。

    (2). 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。

     

    设置方式:

    1
    export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

    可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:

    1
    echo $LD_LIBRARY_PATH

    至此,库的两种设置就完成了。

    2.交叉编译时候如何配置连接库的搜索路径

     交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib, /lib两个目录。因此,在交叉编译的时候,要采取一些方法使得在编译链接的时候找到需要的库。

        首先,要知道:编译的时候只需要头文档,真正实际的库文档在链接的时候用到。 (这是我的理解,假如有不对的地方,敬请网上各位大侠指教) 然后,讲讲如何在交叉编译链接的时候找到需要的库。

    (1)交叉编译时候直接使用-L和-I参数指定搜索非标准的库文档和头文档的路径。例如:

    1
    arm-linux-gcc test.c -L/usr/local/arm/2.95.3/arm-linux/lib -I/usr/local/arm/2.95.3/arm-linux/include

      

    2)使用ld.so.conf文档,将用到的库所在文档目录添加到此文档中,然后使用ldconfig命令刷新缓存。

    (3)使用如下命令:

    1
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib

      

    Linux下动态库使用小结


    1. 静态库和动态库的基本概念

        静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库文件支持,如果机器里没有这些库文件就不能运行。

    2. 如何使用动态库

        如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录然后按照/etc/ld.so.conf里面的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使用 LD_LIBRARY_PATH》)。

        不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH 的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》)。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。

    3.库的链接时路径和运行时路径

        现代连接器在处理动态库时将链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3 (work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过- rpath(或-R )、LD_LIBRARY_PATH指定查找路径。
    展开全文
  • 动态的搜索路径搜索的先后顺序是: (1).编译目标代码时指定的动态搜索路径; (2).环境变量LD_LIBRARY_PATH指定的动态搜索路径; (3).配置文档/etc/ld.so.conf中指定的动态搜索路径; (4).默认的动态...

    说明:下列内容是从网上获取的,未经验证,仅作参考之用


    动态库的搜索路径搜索的先后顺序是:

    (1).编译目标代码时指定的动态库搜索路径;
    (2).环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
    (3).配置文档/etc/ld.so.conf中指定的动态库搜索路径;
    (4).默认的动态库搜索路径/lib;
    (5).默认的动态库搜索路径/usr/lib.
    展开全文
  • Linux指定动态库路径

    2016-03-31 17:12:18
    linux指定动态库路径包括:1.指定编译时动态库路径;2.指定运行时动态库路径。后文提到的动态库路径都是指的是这两种路径。众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib(不管是编译还是运行都会默认搜索这...
  • Linux共享库路径配置  Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,mysql),编译连接可以正常进行,但是在运行时出现如“error while loading shared libraries: libnet.so.1:...
  • 1.查看可执行程序的链接库 使用ldd命令查看可执行程序的链接库 尤其是当我们调用了第三库支持,一般来说,程序设计时会安装整个库,但实际程序需要的并不会是整个库,这时候我们只要通过 ldd 就可以很清晰的查看其...
  • 1. 设置LD_LIBRARY_PATH; 2. 在/etc/ld.so.conf.d目录中创建一个文件XXX.conf,把动态链接库路径写入XXX.conf;  执行ldconfig。 3. 在库的路径下执行/sbin/ldconfig -n。
  • 如果程序需要使用某个动态链接库中的函数,则,在程序的编译阶段和之后的运行阶段都需要这个动态链接库, 即 编译时链接和运行时链接 1. 编译时链接  这个过程是由ld(链接器)来执行的。ld查找动态库中是否含有...
  • 把动态链接库所在的路径添加到/etc/ld.so.conf中 include /etc/ld.so.conf.d/*.conf /usr/local/lib/ 然后更新/etc/so.cache sudo ldconfig 方法二: 同方法一,把具体的so链接库写到/etc/ld.so.conf.d/下的...
  • 文件在链接(静态和共享)和运行(仅限于使用共享的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的搜索路径,所以使用这两个目录中的时不...
  • 一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的搜索路径,所以使用这两个目录中的时不需要进行设置搜索路径即可直接使用。对于处于默认搜索路径之外的,需要将的位置添加到的搜索路径之中。...
  • 这里写自定义目录标题动态库的搜索编译时链接ld-linux编译时搜索动态库路径运行时链接运行时动态库搜索顺序合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合...
  • gcc指定头文件路径及动态链接库路径   本文详细介绍了linux 下gcc头文件指定方法,以及搜索路径顺序的问题。另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论了搜索路径的顺序问题。本文包含了很...
  • Linux共享库路径配置

    2014-05-30 21:50:48
    Linux共享库路径配置  Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libnet,mysql),编译连接可以正常进行,但是在运行时出现如“error while loading shared libraries: libnet.so.1:...
  • ldd命令linux 下可以使用ldd查看可执行文件所需要的动态链接库(*.so)。 注:下文用so代替动态链接库文件。// 举个例子 ~$ ldd /bin/ls linux-vdso.so.1 => (0x00007ffe06386000) libselinux.so.1 =&...
  • Windows/Linux链接器加载动态的搜索路径顺序
1 2 3 4 5 ... 20
收藏数 134,010
精华内容 53,604