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.编译时的-L选项是否影响LD_LIBRARY_PATH的值?

举一个实例:
当前文件夹结构如下:
test.c tools/
tool下有tool.c tool.h my_err.h 以及由此生成的libtool.so
tool下编译生成库文件
gcc -Wall -g -shared -o tool.so tool.c

在当前文件夹引用:
gcc -Wall -g –o  test.c -Ltools -ltool
编译不报错,但是运行加载的时候就出现cannot open shared object file。
如果将该库文件拷贝到/usr/lib下就没有错误,正常运行。

说明编译时的-L选项并不影响环境变量LD_LIBRARY_PATH,-L只是指定了程序编译连接时库的路径,并不影响程序执行时库的路径,系统还是会到默认路径下查找该程序所需要的库。

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/11/3073109.html

Linux下动态库使用小结相关推荐

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

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

  2. Linux下动态库和静态库制作与调用

    Linux下动态库和静态库制作与调用 1.动态库和静态库简介   静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所 ...

  3. linux下动态库(*.so)的路径问题

      最近在使用wxWidgets,这是一个跨平台的C++库,在linux下编译成动态库(*.so),如果将编译后的可执行文件发布到其他机器的linux系统中,需要带上.so文件,这就需要设置一下这些动 ...

  4. gcc g++ Linux下动态库_静态库

    关于Unix静态库和动态库的分析 基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在 ...

  5. Linux下动态库(.so)和静态库(.a)

     linux下有两种库:动态库和静态库(共享库) 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大. 动态库(共享库)的代码在可执行程序运行时才 ...

  6. Linux下动态库(.so)和静态库(.a) 的区别

    linux下有两种库:动态库和静态库(共享库) 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大. 动态库(共享库)的代码在可执行程序运行时才载入内 ...

  7. linux下动态库符号表,Linux动态库(.so)符号表

    最近编译libbinder.so发现system/lib/libbinder.so只有358K,但单独编译生成的obj/SHARED_LIBRARIES/libbinder_intermediates ...

  8. linux中动态链接库用扩展名,Linux操作系统下动态库的生成及链接方法是什么?...

    Linux下动态库文件的扩展名为".so"(Shared Object).按照约定,所有动态库文件名的形式是libname.so(可能在名字中加入版本号).这样,线程函数库被称作l ...

  9. Linux中动态库(共享库)的制作与使用

    0. 库的基本概念 见博客:Linux中静态库的制作与使用 0.1 动态库的工作原理 首先回忆一下静态库,使用静态库,在GCC进行链接时,会把静态库中代码打包到可执行程序中. 但是使用动态库,在GCC ...

最新文章

  1. ubuntu16.04安装curl
  2. tomcat的根路径设置
  3. unc 目录不受支持_Shopify平台对于店铺模版都提供哪些支持
  4. 50個AJAX Tools and Frameworks
  5. 注册cn域名应该注意些什么
  6. 面向对象进阶(day7)
  7. iphonexr电池容量_xr电池容量多少毫安,iphonexr换电池多少钱
  8. Android设计模式之单例模式
  9. 外包如何安排人手-b
  10. python用逗号隔开输出_python思维导图入门第二篇,数据结构,精心整理
  11. 深度剖析Java集合之BitSet
  12. uc极度精简版_UC浏览器安卓版-UC浏览器(UCBrowser)12.0.4.987 去广告精简版-东坡下载...
  13. 软件工程阶段性总结(二)——软件计划和需求分析
  14. 用python做了个桌球瞄准器
  15. 十二黄金圣斗士阴险程度(爆笑)
  16. jmeter 导入java,JMeter导入自定义的Jar包的详解教程
  17. 计算机 我们一起学猫叫歌词,猫叫是什么歌 抖音我们一起学猫叫完整版歌词
  18. ABB KUC321AE HIEE300698R0001、KUC755AE106 3BHB005243R0106、KUC711AE 3BHB004661R0001、KUC720AE01
  19. poi 操作 PPT,针对 PPTX--图表篇
  20. WELL HSR找标识行动起航 - 跨行业国际明星巨匠为“WELL 健康-安全评价”代言

热门文章

  1. arm opcode hook
  2. GridView生成序号
  3. Winform DataGridView数据绑定问题
  4. 北语19秋计算机应用基础作业答案,北语18秋《计算机应用基础》练习1满分答案...
  5. 计算机学英文是什么,“计算机科学与技术专业本科课程”的英文翻译是什么?...
  6. 模板匹配matchTemplate
  7. CentOS 7 / RHEL 7 systemd 指令
  8. Windows下,Netbeans使用C++的配置方法
  9. Linux--date命令 date命令
  10. C语言中输入输出格式控制