Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189108
  • 博文数量: 49
  • 博客积分: 635
  • 博客等级: 中士
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-25 12:58
文章分类

全部博文(49)

文章存档

2012年(9)

2011年(40)

分类: LINUX

2011-11-20 20:18:43

   动态链接库(dynamic libs),又称为共享库(shared libs),与静态链接库不同,前者分为两个阶段链接到程序中。第一步,在编译器件,链接器确认程序所需要的标示(包括变量和函数等)包含在程序中,或者是动态链接库的一部分。在这里,动态链接库中的目标文件并没有插入到可执行文件中。第二部,当程序运行的时候,系统的动态加载器(dynamic loader)检查哪些动态链接库需要连接到程序,从而将这些库文件载入内存。除了可以减少内存的开销,动态链接库还是有缺陷的,如果我们重新编译库文件,再次运行程序,我们会发现库文件已经存在与内存中,也就是之前的旧库文件。
   建立一个动态链接库,与建立静态链接库相比,主要有两大区别:
   1、编译位置无关代码(PIC, Position Independeng Code),当我们使用目标文件的时候,我们并不知道它们会被插入到程序的哪个地址,同时,许多不同的程序共用相同的库文件,并且每个程序都会将库文件载入到不同的地址,所以我们用到了相对地址(这个地方还是不是很清楚,功力有限),这里用到编译器的选项——"fPIC"或者"fpic"。
   2、建立库文件,相对于静态库文件,动态库文件并不是归档文件,这里需要用到gcc的-shared 选项。

   假如有三个文件util_file.c,util_net.c,util_math.c,则建立动态链接库的代码如下
  1. cc -fPIC -c util_file.c
  2. cc -fPIC -c util_net.c
  3. cc -fPIC -c util_math.c
  4. cc -shared libutil.so util_file.o util_net.o util_math.o
这样,我们就得到了动态链接库文件libutil.so,那么怎么应用到程序中呢?
1、在编译期间,生成可执行文件时,链接器需要扫描库文件。
  1. cc main.o -L. -lutil -o prog
2、运行期间,我们需要告诉动态加载器怎样找到我们的动态库文件。
动态加载器一般都会在特定路径查找库文件(比如/lib, /usr/lib等等),想要加载自定义的库文件,我们需要用到'LD_LIBRARY_PATH'环境变量。在bash中设置环境变量:
  1. LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/lee/program/build_lib/shared_lib/


阅读(2753) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~