動態庫的顯示調用(動態加載):
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]#