Linux下学习动态库的笔记2

来源:互联网 发布:年度网络安全检查报告 编辑:程序博客网 时间:2024/06/17 17:27

 

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 __cplusplusextern "C" {#endifint 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]#