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]#

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章