如何調(diào)用so庫文件

制作so文件

首先先制作制作so文件:libadd_c.so
[ add.c]

int add(int a, int b) {  
    return a + b;  
}  

編譯:

gcc -shared -fpic -o libadd_c.so add.c
  • -shared 生成共享目標文件与纽,通常用在建立共享庫時
  • -fpic 作用于編譯階段放吩,告訴編譯器產(chǎn)生與位置無關(guān)代碼(Position-Independent Code),則產(chǎn)生的代碼中退盯,沒有絕對地址买猖,全部使用相對地址膨蛮,故而代碼可以被加載器加載到內(nèi)存的任意位置,都可以正確的執(zhí)行竖慧。
    這正是共享庫所要求的嫌套,共享庫被加載時,在內(nèi)存的位置不是固定的圾旨。

參考:gcc-4.9.4命令文檔

執(zhí)行編譯任務(wù)踱讨,輸出相應(yīng)的libadd_c.so文件。

編寫測試函數(shù)

[ test.cpp]

#include <stdio.h>  
#include <dlfcn.h>  
#include <stdlib.h>  
#include <iostream>  
using namespace std;  
int main()  
{  
    int a = 0;  

    void *handle = dlopen("./libadd_c.so", RTLD_LAZY);  

    if(!handle)  {   
        printf("open lib error\n");  
        cout<<dlerror()<<endl;  
        return -1;  
    }   

    typedef int (*add_t)(int a, int b);  
    add_t add = (add_t) dlsym(handle, "add");  
    if(!add)  {   
        cout<<dlerror()<<endl;  
        dlclose(handle);  
        return -1;  
    }   

    a = add(4, 4);  
    printf("a = %d\n",a);  
    dlclose(handle);  
    return 0;  
}

編譯:

g++ test.cpp -ldl -o test

運行

./test
輸出為:8

注意:typedef int (*add_t)(int a, int b);聲明一個函數(shù)指針砍的。
首先你要明白函數(shù)指針的概念
int *p(int ,int );//聲明一個函數(shù)
int (*p)(int ,int);//聲明一個函數(shù)指針
typedef int(*add_t)(int, int);

就是把這個類型的函數(shù)指針的聲明變?yōu)?code>add_t

在使用動態(tài)鏈接庫libadd_c.so文件的時候痹筛,主要使用到了四個函數(shù):
(1) dlopen()

  • 函數(shù)原型void *dlopen(const char *libname,int flag);
  • 功能描述:dlopen必須在dlerror,dlsym和dlclose之前調(diào)用廓鞠,表示要將庫裝載到內(nèi)存帚稠,準備使用。如果要裝載的庫依賴于其它庫床佳,必須首先裝載依賴庫滋早。如果dlopen操作失敗,返回NULL值砌们;如果庫已經(jīng)被裝載過杆麸,則dlopen會返回同樣的句柄。

參數(shù)中的libname一般是庫的全路徑浪感,這樣dlopen會直接裝載該文件角溃;如果只是指定了庫名稱,在dlopen會按照下面的機制去搜尋:
a.根據(jù)環(huán)境變量LD_LIBRARY_PATH查找
b.根據(jù)/etc/ld.so.cache查找
c.查找依次在/lib/usr/lib目錄查找篮撑。
flag參數(shù)表示處理未定義函數(shù)的方式减细,可以使用RTLD_LAZY或RTLD_NOW。RTLD_LAZY表示暫時不去處理未定義函數(shù)赢笨,先把庫裝載到內(nèi)存未蝌,等用到?jīng)]定義的函數(shù)再說驮吱;RTLD_NOW表示馬上檢查是否存在未定義的函數(shù),若存在萧吠,則dlopen以失敗告終左冬。

(2) dlerror()

  • 函數(shù)原型char *dlerror(void);
  • 功能描述:dlerror可以獲得最近一次dlopen,dlsym或dlclose操作的錯誤信息纸型,返回NULL表示無錯誤拇砰。dlerror在返回錯誤信息的同時,也會清除錯誤信息狰腌。

(3) dlsym()

  • 函數(shù)原型void *dlsym(void *handle, const char *symbol);
  • 功能描述:在dlopen之后除破,庫被裝載到內(nèi)存。dlsym可以獲得指定函數(shù)(symbol)在內(nèi)存中的位置(指針)琼腔。如果找不到指定函數(shù)瑰枫,則dlsym會返回NULL值。但判斷函數(shù)是否存在最好的方法是使用dlerror函數(shù)丹莲。

注意:個人感覺從dlsym()尋找到內(nèi)存中指針位置這個操作還是很麻煩的光坝。

(4) dlclose

  • 函數(shù)原型int dlclose(void *);
  • 功能描述:將已經(jīng)裝載的庫句柄減一,如果句柄減至零甥材,則該庫會被卸載盯另。如果存在析構(gòu)函數(shù),則在dlclose之后洲赵,析構(gòu)函數(shù)會被調(diào)用土铺。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市板鬓,隨后出現(xiàn)的幾起案子悲敷,更是在濱河造成了極大的恐慌,老刑警劉巖俭令,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件后德,死亡現(xiàn)場離奇詭異,居然都是意外死亡抄腔,警方通過查閱死者的電腦和手機瓢湃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赫蛇,“玉大人绵患,你說我怎么就攤上這事∥蛟牛” “怎么了落蝙?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我筏勒,道長移迫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任管行,我火速辦了婚禮厨埋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捐顷。我一直安慰自己荡陷,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布迅涮。 她就那樣靜靜地躺著废赞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逗柴。 梳的紋絲不亂的頭發(fā)上蛹头,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天顿肺,我揣著相機與錄音戏溺,去河邊找鬼。 笑死屠尊,一個胖子當著我的面吹牛旷祸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讼昆,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼托享,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浸赫?” 一聲冷哼從身側(cè)響起闰围,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎既峡,沒想到半個月后羡榴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡运敢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年校仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传惠。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡迄沫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卦方,到底是詐尸還是另有隱情羊瘩,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站困后,受9級特大地震影響乐纸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜摇予,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一汽绢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侧戴,春花似錦宁昭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜕猫,卻和暖如春寂曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背回右。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工隆圆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翔烁。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓渺氧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹬屹。 傳聞我的和親對象是個殘疾皇子侣背,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容