Linux下学习动态库的笔记3

 

动态库的显示调用(动态加载):
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]#

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值