http://www.cnblogs.com/lovevivi/archive/2013/01/15/2861211.html

在接手一个很古老的程序时,发现其所使用的动态库都实在是太陈旧了,正式运行环境中部署的库都是相适应的,而目前的开发测试环境中均是部署的新的升级版本。为了能在这些环境下开发测试,程序得能在自定义的路径里来搜索。因此在这里复习一下linux中程序对动态链接库的搜索顺序,如下所述:

1.首先查看程序文件的.dynamic 段是否包含了一个叫DT_RPATH的项(它是一个以冒号分隔的库文件搜索目录列表)。

   怎么设置这个选项?

   需要在编译连接程序的时候使用-Wl,-rpath选项,假设一个程序test需要使用liblib.so库,如下所示进行编译连接:

g++ -o test -L. -llib -Wl,rpath=./ test.cpp

这样在执行test程序时,test便会先到./即当前目录下查找所需要的动态库liblib.so

2.查找是否存在环境变量 LD_LIBRARY_PATH(它是一个以冒号分隔的库文件搜索目录列表)。

   怎么设置这个选项?当然是设置linux下的环境变量就可以了。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

当然,这种方法是对当前登录生效的。如果想开机即有效,跟其它环境变量的设置也是一样,需要修改一些配置文件。

3.查看库高速缓存文件 /etc/ld.so.conf ,它包含了库名和路径的一个对应列表,如果库名存在,连接器就使用它对应的路径,用这个查找方法能够找到大部分的库。

   怎么设置这个选项?可以直接编辑ld.so.conf加入需要查找的路径,也可以在/etc/ld.so.conf.d目录下的己有文件中加入路径,或者在该目录下新建一个文件(名字为*.conf即可),再把需要的路径加入到该文件中。最后执行ldconfig即可生效。

4.查找默认路径/lib和/usr/lib,

如果经过了以上的步骤仍然查找失败,则将报错并退出相关程序。

对于前三个步骤来说,我们均是可以进行设置调整的,其中第三个步骤中的设置需要root权限才能进行,且会影响所有的程序。当使用第一、第二中的方法进行了设置调整后,我们便可以使多种版本的库共存在同一环境下进行测试,同名也无所谓。
*********************************************************************

环境变量LD_LIBRARY_PATH用来指定查找共享库时除了默认路径之外的其他路径。(该路径在默认路径之前查找)
移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时我们可以设置LD_LIBRARY_PATH。
例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/lib/
这样就可以使用/work/lib/下的库文件了,运行程序后系统会自动到环境变量LD_LIBRARY_PATH指定的路径中查找其所需的库。
系统查找动态库的顺序
系统先找LD_LIBRARY_PATH下的库再找/lib and /usr/lib等路径下的库,还有/etc/ld.so.conf里指定的路径(如果ld.so.conf存在),man ldconfig for more information
[url=http://infomax/bbs/misc.php?action=viewratings&tid=111&pid=228][/url]
使Linux启动之后就加载LD_LIBRARY_PATH的路径
/etc/rc.d/rc.local文件中加入export LD_LIBRARY_PATH="xxxxx" 即可
如果在链接时使用了"-R"和"-L"选项,则相关动态库的路径将保存在ELF文件中,于
是以后的运行中不再需要设置环境变量去定位动态库。比如,有一个
/usr/local/lib/libfoo.so,而你的bar程序需要这个libfoo.so,编译、链接时最好
这样 :gcc -Wall -pipe -O3 -o bar -R/usr/local/lib -L/usr/local/lib bar.c -lfoo

Linux下共享库的查找顺序相关推荐

  1. linux 下共享库创建及使用

    1.创建共享库 [xpan@localhost 2.5.3]$ ls libhello.c  libhello.h  usehello.c [xpan@localhost 2.5.3]$ gcc -f ...

  2. linux下共享库的制作及常见的问题

    将自己写的链表生成共享库  1.编译  2.设置库名:    库的名称格式:lib + XXX + 版本号.so (库的名称为XXX) -shared 生成共享文件库 -fpic 动态链接    3. ...

  3. Linux找头文件规则,linux 头文件、库文件查找顺序

    linux 头文件.库文件查找顺序 默认分类 2009-11-14 01:24:28 阅读126 评论0 字号:大中小 linux 头文件.库文件查找顺序 2009-11-03 12:36 Inclu ...

  4. linux下静态库、动态库总结

    一.基本概念 1.1.什么是库        在 windows 平台和 linux 平台下都大量存在着库. 本质上来说库是一种可执行的二进制代码(但不可以独立执行),可以被操作系统载入内存执行. 由 ...

  5. linux 动态库建立,浅析linux下静态库和动态库的建立和使用

    在粤嵌学了很多知识,我们把常用的公用函数放在一起做成一个函数库,可以供其他程序共同使用,函数库本质上说,是一个可执行代码的二进制形式,可被操作系统载入内存执行.linux下的库分为两种:静态库,后缀名 ...

  6. Linux下动态库的创建与更新

    Linux下动态库(libname.x.y.z)的创建与更新 由于主程序和它依赖的共享库是由不同的开发者开发的.共享库的开发者会不停地更新共享库的版本,以修正bug,增加功能或改进性能.版本多了之后, ...

  7. linux安装了xml怎么编译,linux下libxml库的安装及编译

    linux下libxml库的安装及编译 1. 下载和安装LIBXML2 Libxml2是个C语言的XML程式库,能简单方便的提供对XML文件的各种操作,并且支持XPATH查询,及部分的支持XSLT转换 ...

  8. linux下libxml2库使用说明

    linux下libxml2库使用说明_lanlicen的专栏-CSDN博客_linux xml库 第一章 什么是XML? 1.xml简介 XML(Extensible Markup Language) ...

  9. nux下共享库(SO)有关的几个环境变量 zz

    Linux支持共享库已经有悠久的历史了,不再是什么新概念了.大家都知道如何编译.连接以及动态加载(dlopen/dlsym/dlclose) 共享库.但是,可能很多人,甚至包括一些高手,对共享库相关的 ...

最新文章

  1. 单列模式(懒汉)测试代码
  2. 封装成vla函数_第四章:Python之函数
  3. Yammer Metrics,一种监视应用程序的新方法
  4. JanusGraph: 可视化 Gephi 插件安装
  5. 南昌大学c语言大作业,南昌大学计算机C语言答案2
  6. 奢侈的休闲度假时光——带着小样儿去三亚(三)
  7. “同样的”约束,不同的位置
  8. 纯JS实现简易扫雷小游戏网页项目
  9. 4 基于pyecharts的python数据可视化——散点图和折线图的绘制
  10. 【从零开始学习Go语言】一.初识Go语言
  11. Blender建模汇总
  12. 圣诞节计算机老师贺卡祝福语,祝老师圣诞节快乐贺卡 圣诞祝福语贺卡简短
  13. ES部分查询方法,elasticsearch查询方法
  14. 2015数据泄露调查报告
  15. ROT13加密和解密
  16. Django源码cookie解读:关于中文cookie会被吞掉并截断的问题。
  17. 科技公司逐鹿手机配件赛道,“降维打击”会出现吗?
  18. 【四二学堂】jquery方式ajax获取数据并渲染页面
  19. IE8-下背景色半透明滤镜在jquery动画中失效问题记录
  20. [CTF] 每日一题汇总

热门文章

  1. 字典服务的设计与管理
  2. Android 虚拟导航键适配
  3. 学计算机远程控制,怎样远程控制局域网计算机
  4. 【图论】图的建立——邻接矩阵法
  5. 如何使用电子签名服务,告别传统纸质合同,实现可信无纸化办公?
  6. Linux中部署前端项目(Apache服务器)
  7. XP系统32GB U盘不能识别的一种原因及解决办法
  8. Vue--动画效果与过度效果
  9. vue---vis实现复杂网状关系图显示
  10. 仿写 QQ 和 微信 联系人列表: