Linux下学习动态库的笔记3

来源:互联网 发布:软件钉钉有什么用处 编辑:程序博客网 时间:2024/06/05 05:44

 

动态库的显示调用(动态加载):
1.编写动态库函数代码:
//myAddLib.h

/*************************************************************        FileName : myAddLib.h    FileFunc : 定义头文件       Version  : V0.1        Author   : Sunrier        Date     : 2012-05-03    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-03    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-03    Descp    : Linux下实现动态库  *************************************************************/#include <stdio.h>#include <dlfcn.h>#define SOFILE "./libmyAddLib.so"int main(int argc,char *argv[]){        int iNumber1,iNumber2,iSum = 0;        void *hdl = NULL;//动态库句柄           hdl = dlopen(SOFILE,RTLD_LAZY);//打开动态链接库          if( NULL==hdl )        {             printf("No libmyAddLib.so file\n");             return 1;        }        /*函数指针*/        int(*add)(int,int);        add = dlsym(hdl,"add");//查找符号表,定位共享函数          char *error = dlerror();//检测错误          if( error )        {            printf("No function!\n");            return 1;        }        iNumber1 = 10;        iNumber2 = 20;        iSum = add(iNumber1,iNumber2);//调用此共享函数          //iSum = (*add)(iNumber1,iNumber2);//调用此共享函数          printf("iSum=%d\n",iSum);        printf("Hello Sunrier!\n");        dlclose(hdl);//关闭共享库          hdl =NULL;        return 0;}

 

使用到了四个函数(头文件dlfcn.h):
dlopen():打开动态库,第一个参数问文件名,第二个参数是打开方式一般为RTLD_LAZY.成功则返回"句柄",否则返回NULL
dlsym():获取动态库中的函数指针,第一个参数为句柄,第二个参数是函数名
dlerror():检查操作是否失败,失败返回错误字符串.否则返回NULL
dlclose():关闭动态库
2)编译目标文件
#gcc testAddLib.c -o testAddLib -ldl
-ldl是连接dl,即上面四个函数的实体。
3)执行可执行文件
[root@localhost Sunrier]# ./testAddLib
iArg1= 10 , iAgr2= 20
iSum=30
Hello Sunrier!
[root@localhost Sunrier]#

 

原创粉丝点击