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