溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux下如何調(diào)用dll& .so庫(kù)

發(fā)布時(shí)間:2022-01-26 10:28:22 來(lái)源:億速云 閱讀:146 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了Linux下如何調(diào)用dll& .so庫(kù),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

dll是Dynamic Link Library的縮寫(xiě)。DLL是一個(gè)包含可由多個(gè)程序,同時(shí)使用的代碼和數(shù)據(jù)的庫(kù)。

Linux下如何調(diào)用dll& .so庫(kù)

 {
 void *handle=dlopen("./libdemo4.so",RTLD_LAZY);
 void(*fun)(int)=dlsym(handle,"diamond");
 fun(5);
 dlclose(handle);}

使用libdl.so庫(kù) 動(dòng)態(tài)庫(kù)加載的原理

動(dòng)態(tài)庫(kù)中函數(shù)的查找已經(jīng)封裝成庫(kù)libdl.so dlopen 打開(kāi)一個(gè)動(dòng)態(tài)庫(kù) dlsym 在打開(kāi)動(dòng)態(tài)庫(kù)找一個(gè)函數(shù) dlclose 關(guān)閉動(dòng)態(tài)庫(kù) //dlerror 返回錯(cuò)誤

注意了 動(dòng)態(tài)庫(kù)是可以執(zhí)行,靜態(tài)庫(kù)不能執(zhí)行 但動(dòng)態(tài)庫(kù)沒(méi)有main,不能獨(dú)立執(zhí)行。 動(dòng)態(tài)庫(kù)不會(huì)連接成程序的一部分。 程序執(zhí)行的時(shí)候,必須需要?jiǎng)討B(tài)庫(kù)文件。

 ldd  察看程序需要調(diào)用的動(dòng)態(tài)庫(kù)
  ldd 只能察看可執(zhí)行文件.
  readelf -h 察看執(zhí)行程序頭.
  nm   察看庫(kù)中的函數(shù)符號(hào)

3.動(dòng)態(tài)庫(kù)的編譯 3.1.編譯 -c -fpic(可選) 3.2.連接 -shared 4.使用動(dòng)態(tài)庫(kù) gcc 代碼 動(dòng)態(tài)庫(kù)文件名 gcc 代碼 -l庫(kù)名 -L動(dòng)態(tài)庫(kù)所在路徑

標(biāo)準(zhǔn)命名規(guī)則: lib庫(kù)名.so lib庫(kù)名.a

  -l 庫(kù)名  -L 庫(kù)所在路徑

大深坑: 4.1.執(zhí)行程序怎么加載動(dòng)態(tài)庫(kù)? 4.2.動(dòng)態(tài)庫(kù)沒(méi)有作為執(zhí)行程序的一部分,為什么連接需要指定動(dòng)態(tài)庫(kù)以及目錄? 連接器需要確定函數(shù)在動(dòng)態(tài)庫(kù)的中的位置

動(dòng)態(tài)庫(kù)的加載: 1.找到動(dòng)態(tài)庫(kù) 2.加載動(dòng)態(tài)庫(kù)到內(nèi)存 3.映射到用戶的內(nèi)存空間 系統(tǒng)對(duì)動(dòng)態(tài)庫(kù)查找規(guī)則: /lib /usr/lib 到環(huán)境變量LD_LIBRARY_PATH指定的路徑中查找

三.靜態(tài)庫(kù)的編譯 1.編譯過(guò)程(*.a achieve) 1.1.編譯成目標(biāo)文件 -static 可選 gcc -c -static 代碼文件.c

1.2.歸檔成靜態(tài)庫(kù) ar工具 ar -r -t ar -r 靜態(tài)庫(kù)文件 被歸檔的文件

  nm工具(察看函數(shù)符號(hào)表)
   nm 靜態(tài)庫(kù)或者動(dòng)態(tài)庫(kù)或者目標(biāo)文件或者執(zhí)行文件

1.3.使用靜態(tài)庫(kù) gcc 代碼 靜態(tài)庫(kù)

結(jié)晶步驟:

 1.函數(shù)等代碼封裝的二進(jìn)制已經(jīng)編譯的歸檔文件
 
 2.ar歸檔方式 庫(kù)的方式

3.編譯好的程序運(yùn)行的時(shí)候不依賴庫(kù)。庫(kù)作為程序的一部分編譯連接。

 4.文件集合(歸檔)

5.庫(kù)命名規(guī)則 注意了: lib庫(kù)名.a.主版本號(hào).副版本號(hào).批號(hào) lib庫(kù)名.a 庫(kù)使用規(guī)則 -l 庫(kù)名 -L 庫(kù)所在目錄

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Linux下如何調(diào)用dll& .so庫(kù)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI