Linux下学习动态库的笔记:
动态库(dynamic libraries),或叫共享库(shared libraries)是一些编译好的代码片断,当需要它的程序运行时.会由/lib/ld.so负责动态地加载它.使用它的好处有:节约磁盘和内存空间,因为同一段代码只有一个副本;节约编译时间只.需编译更改过的模块即可.
动态库的命名规则为:lib + 库名称 + .so + .version,如libstdc++.so.6
动态库都会有一个相应的.la文件,这是用来在编译过程中给编译器使用的.如果是程序中动态加载的话就不需要它了.
动态库在Windows下是DLL文件。
动态库有两种方法:隐式调用(动态链接)和显示调用(动态加载)
动态库的隐式调用(动态链接):
1.编写动态库函数代码:
//myAddLib.h
/************************************************************* FileName : myAddLib.h FileFunc : 定义头文件 Version : V0.1 Author : Sunrier Date : 2012-05-02 Descp : Linux下实现动态库 *************************************************************/ #ifndef _MYADDLIB_H_ #define _MYADDLIB_H_ #ifdef __cplusplus extern "C" { #endif int add(int ,int ); #ifdef __cplusplus } #endif #endif
//myAddLib.c
/************************************************************* FileName : myAddLib.c FileFunc : 定义动态库实现文件 Version : V0.1 Author : Sunrier Date : 2012-05-02 Descp : Linux下实现动态库 *************************************************************/ #include <stdio.h> int add(int iArg1,int iArg2) { printf("iArg1= %d , iAgr2= %d \n",iArg1,iArg2); return (iArg1+iArg2); }
2.制作库文件:
#gcc -fpic myAddLib.c //创建.o文件
#gcc -shared -o libmyAddLib.so myAddLib.o //创建so
或者
#gcc -fpic -shared -o libmyAddLib.so myAddLib.c //直接创建so
-fpic:产生位置无关代码
-shared:生成共享库
注意:库文件名一定要以lib打头, .so结尾
执行完后会生成libmyAddLib.so动态函数库
3.使用库文件:
1)编写测试动态库文件程序
//testAddLib.c
/************************************************************* FileName : testAddLib.c FileFunc : 测试动态库文件 Version : V0.1 Author : Sunrier Date : 2012-05-02 Descp : Linux下实现动态库 *************************************************************/ #include <stdio.h> #include "myAddLib.h" int main(int argc,char *argv[]) { int iNumber1,iNumber2,iSum = 0; iNumber1 = 10; iNumber2 = 20; iSum = add(iNumber1,iNumber2); printf("iSum=%d\n",iSum); printf("Hello Sunrier!\n"); return 0; }
2)编译目标文件
gcc -o testAddLib testAddLib.c -L. -lmyAddLib
-L指定动态函数库的位置供查找,注意L后面还有'.',表示动态函数库在本目录下查找。
此时还不能立即./testAddLib,因为在动态函数库使用时,会查找/usr/lib或/lib目录下的动态函数库,而此时我们生成的库不在里边。
3)执行可执行文件
这个时候有好几种方法可以让他成功运行:
最直接最简单的方法就是把libmyAddLib.so放到/usr/lib 或/lib中去。
还有一种方法环境变量,假设libmyAddLib.so在/home/Sunrier/lib
export LD_LIBRARY_PATH=/home/Sunrier/lib:$LD_LIBRARY_PATH
另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig。
/etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib或/lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig。
[root@localhost lib]# cp libmyAddLib.so /lib/
[root@localhost lib]# ./testAddLib
iArg1= 10 , iAgr2= 20
iSum=30
Hello Sunrier!
[root@localhost lib]#