Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11434
  • 博文数量: 8
  • 博客积分: 1430
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-30 23:05
文章分类

全部博文(8)

文章存档

2010年(1)

2009年(7)

我的朋友
最近访客

分类:

2009-11-01 16:33:54

linux下的库文件有两种,一种是动态库文件,以.so为后缀,一种是静态库文件,以.a为后缀
 
通常动态库是有利于程序缩小空间同时有利于程序升级,一般情况下,动态库链接时优先级高于
静态库。
 
如何生成动态库:
 以hello.c hello.h 为例,
 该程序生成库文件的文件名为: libhello.a, libhello.so
       静态库的生成方法:
        gcc -c hello.c -o hello.o(生成目标程序
        ar cqs libhello.a hello (连接生成静态库
       静态库的生成方法:
        gcc  -c hello -o hello.o(生成目标程序
        gcc  -shared -fPIC -Wl, -soname, libhello.so.1 -o libhello.so.1.0 hello.o
        (soname 直接传递给链接器处理,连接器在会将soname嵌入到二进制文件中而
         不是库文件名称,上述库文件libhehllo.so.1.0,同时库名标志libhello.so.1.
         这样就能允许多个版本的库文件的存在。 这样方便
         其中: -shared是表示目标代码生成的是共享库而非应用程序
               -fPIC 表示生成的共享库是和位置无关,做到可重用性(需要进一步理解
如何使用库:
    对于静态库而言,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,所以一旦连接成功,静态程序就可以不再调用。
    相对来说,简单来说是在连接时做一个符号标记,执行调用库中函数的才真正调用。
    系统中如果同时存在静态库和动态,系统优先选择连接动态库。我们可以使用-Bstatic 和-Bdynamic莱指定应用程序所需要的库。
    对于动态库,如果不使用连接选项,我们可以使用dlsym dlopen dlclose来进行库和函数的加载和卸载操作。
 
库路径的查找:
   1.通常应用程序默认的搜索路径为:/usr/lib和/lib目录,并且搜先查找动态库,然后试图查找动态
   因此我们可以将动态库放到这两个目录下。
   2.同样我们可以使用-L选项来执行库的位置 例如 L./lib 目录,应用程序就会在当前lib目录下查找该库文件(这种连接方式不利于影响程序的移植性
   3. LD_LIBRARY_PATH环境变量中加上库所在路径,通常在profile等文件设置,同时通过export LD_LIBRARY_PATH=""进行设置系统环境变量
   4. 将库的路径/etc/ld.so.conf加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。
 
库中符号的显示:
   可以nm命令可以打印出库中的涉及到的所有符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有 三种,一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;一种是库中定义的函数,用T表示,这是最常见的;另外一种是所谓的“弱 态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。例如,假设开发者希望知道上文提到的hello库中是否定义了 printf():
阅读(404) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~