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