您的位置:首页 > 运维架构 > Linux

Linux下学习动态库的笔记3

2012-05-03 10:24 211 查看
动态库的显示调用(动态加载):

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 __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-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]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: