新聞中心
隨著軟件開(kāi)發(fā)的發(fā)展,日益復(fù)雜的應(yīng)用程序需要更多的代碼復(fù)用性。這就是Linux動(dòng)態(tài)庫(kù)出現(xiàn)的原因。Linux動(dòng)態(tài)庫(kù)是一種可以共享的代碼庫(kù),使用動(dòng)態(tài)鏈接的方式加載到內(nèi)存中,使得應(yīng)用程序在運(yùn)行時(shí)可以調(diào)用其中定義的函數(shù)和變量。使用動(dòng)態(tài)庫(kù)可以帶來(lái)諸如減小程序大小、加快程序啟動(dòng)和運(yùn)行速度、更方便的更新和維護(hù)等優(yōu)點(diǎn)。在本文中,我們將介紹Linux動(dòng)態(tài)庫(kù)的基本概念和使用方法,以及在實(shí)際開(kāi)發(fā)中如何使用動(dòng)態(tài)庫(kù)來(lái)提高代碼復(fù)用性。

創(chuàng)新互聯(lián)公司主營(yíng)集安網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,APP應(yīng)用開(kāi)發(fā),集安h5成都小程序開(kāi)發(fā)搭建,集安網(wǎng)站營(yíng)銷推廣歡迎集安等地區(qū)企業(yè)咨詢
1. 動(dòng)態(tài)庫(kù)入門
動(dòng)態(tài)庫(kù)是編譯后的二進(jìn)制代碼,與靜態(tài)庫(kù)相比,動(dòng)態(tài)庫(kù)可以在運(yùn)行時(shí)動(dòng)態(tài)鏈接到應(yīng)用程序中,而不需要把庫(kù)文件的代碼全部復(fù)制到應(yīng)用程序里面。這樣做的好處是可以省略重復(fù)的代碼,減小程序的體積,提高程序的運(yùn)行效率。
動(dòng)態(tài)庫(kù)分為共享庫(kù)(Shared Library)和動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library)。共享庫(kù)是Linux中廣泛使用的一種動(dòng)態(tài)庫(kù)類型,也是本文重點(diǎn)介紹的內(nèi)容。共享庫(kù)擁有以下幾個(gè)特點(diǎn):
(1)可以被多個(gè)程序共享使用。
(2)可以是編譯后的二進(jìn)制文件,也可以是腳本。
(3)可以動(dòng)態(tài)加載到內(nèi)存中,減小程序的內(nèi)存占用。
(4)可以使用工具對(duì)共享庫(kù)進(jìn)行管理。
共享庫(kù)又分為靜態(tài)鏈接的共享庫(kù)和動(dòng)態(tài)鏈接的共享庫(kù)。靜態(tài)鏈接的共享庫(kù)(即.so)是在程序執(zhí)行時(shí)直接載入內(nèi)存,占用內(nèi)存較多,但載入后不需要在磁盤上保留。動(dòng)態(tài)鏈接的共享庫(kù)(即.dll)是程序執(zhí)行時(shí)才載入內(nèi)存,占用內(nèi)存較少,但必須在磁盤上保留。
在Linux中,常見(jiàn)的共享庫(kù)文件后綴名為.so,通常包含多個(gè)函數(shù)定義和變量定義,它們被組織到一個(gè)可執(zhí)行文件中,稱為動(dòng)態(tài)鏈接庫(kù)。如果一個(gè)程序需要使用一個(gè)動(dòng)態(tài)鏈接庫(kù)中的函數(shù),它需要在運(yùn)行時(shí)動(dòng)態(tài)加載這個(gè)庫(kù)文件,并鏈接到應(yīng)用程序中。這個(gè)過(guò)程稱為動(dòng)態(tài)鏈接。
2. Linux動(dòng)態(tài)庫(kù)的編寫(xiě)和編譯
表面上看,編寫(xiě)Linux動(dòng)態(tài)庫(kù)與編寫(xiě)靜態(tài)庫(kù)沒(méi)有太大區(qū)別。不同之處在于,在編寫(xiě)代碼時(shí),需要注意函數(shù)和變量的可見(jiàn)性。如果要在外部程序中使用某個(gè)函數(shù)或變量,需要通過(guò)庫(kù)的頭文件進(jìn)行聲明。如果想要在共享庫(kù)中定義一個(gè)只能在共享庫(kù)中訪問(wèn)的函數(shù)或變量,則需要在函數(shù)或變量的定義前面添加static關(guān)鍵字,將其限制在局部作用域內(nèi)。
動(dòng)態(tài)庫(kù)的編譯同樣需要注意一些細(xì)節(jié)。與靜態(tài)庫(kù)不同,編譯共享庫(kù)時(shí)需要將編譯選項(xiàng)中的-l選項(xiàng)修改為-shared選項(xiàng)。此外,還需要加上-fPIC選項(xiàng)生成位置獨(dú)立的代碼,以便把庫(kù)文件鏈接進(jìn)多個(gè)程序中。編寫(xiě)和編譯共享庫(kù)的詳細(xì)步驟如下:
(1)編寫(xiě)共享庫(kù)文件,可用C/C++等多種語(yǔ)言實(shí)現(xiàn)。
(2)在代碼中定義需要共享的函數(shù)和變量。
(3)編譯代碼時(shí),將編譯選項(xiàng)-l替換為-shared選項(xiàng)。
(4)使用-fPIC選項(xiàng)編譯生成位置獨(dú)立的代碼。
(5)使用gcc命令將編譯好的目標(biāo)文件生成共享庫(kù)。
下面是一個(gè)簡(jiǎn)單的示例程序:
/*example.c*/
#include
int add(int a, int b) { return a + b; } int sub(int a, int b) { return a – b; }
編譯成共享庫(kù)的命令如下所示:
$gcc -fPIC -shared -o libexample.so example.c
可以看到,在編譯共享庫(kù)時(shí),需要使用-shared選項(xiàng)。
3. Linux動(dòng)態(tài)庫(kù)的使用
使用Linux動(dòng)態(tài)庫(kù),可以在應(yīng)用程序執(zhí)行時(shí)將庫(kù)文件動(dòng)態(tài)鏈接到程序中,以便在程序中調(diào)用庫(kù)中的函數(shù)和變量。通常情況下,應(yīng)用程序和動(dòng)態(tài)庫(kù)的開(kāi)發(fā)是分開(kāi)進(jìn)行的,應(yīng)用程序需要在編譯時(shí)告訴編譯器去哪里找到動(dòng)態(tài)庫(kù)并鏈接它。鏈接時(shí)需要使用-l選項(xiàng)將動(dòng)態(tài)庫(kù)鏈接到應(yīng)用程序中。如果動(dòng)態(tài)庫(kù)被正確鏈接,程序就可以在運(yùn)行時(shí)動(dòng)態(tài)加載到庫(kù)文件中訪問(wèn)需要的函數(shù)和變量。
動(dòng)態(tài)庫(kù)的使用主要分為兩個(gè)步驟,首先在程序中包含庫(kù)的頭文件,然后在鏈接程序時(shí)告訴編譯器去哪里尋找?guī)煳募?。在Linux中,可以在編譯指令中使用-l選項(xiàng)鏈接庫(kù)文件,也可以在程序中使用dlopen()函數(shù)打開(kāi)庫(kù)文件,然后通過(guò)dlsym()函數(shù)獲取庫(kù)中的函數(shù)和變量。
下面是一個(gè)示例程序:
/*mn.c*/
#include
#include “example.h”
int mn(int argc, char *argv[]) {
void *handle; int (*fptr)(int, int); int a = 20, b = 5; handle = dlopen(“./libexample.so”, RTLD_LAZY); fptr = dlsym(handle, “add”); printf(“Result of add function: %d\n”, (*fptr)(a, b)); fptr = dlsym(handle, “sub”); printf(“Result of sub function: %d\n”, (*fptr)(a, b)); dlclose(handle); return 0; }
該程序調(diào)用了libexample.so中的add()和sub()函數(shù),并打印了它們的結(jié)果。
4. Linux動(dòng)態(tài)庫(kù)的優(yōu)勢(shì)
Linux動(dòng)態(tài)庫(kù)采用動(dòng)態(tài)鏈接的方式加載到內(nèi)存中,使得應(yīng)用程序可以動(dòng)態(tài)調(diào)用其中定義的函數(shù)和變量。相比于靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)具有以下優(yōu)勢(shì):
(1)代碼復(fù)用性更好。多個(gè)應(yīng)用程序可以共用同一庫(kù)文件,而不需要把重復(fù)代碼復(fù)制到每個(gè)應(yīng)用程序中。
(2)更加靈活。動(dòng)態(tài)庫(kù)可以在程序執(zhí)行過(guò)程中動(dòng)態(tài)加載,而不需要在編譯時(shí)就把全部庫(kù)文件靜態(tài)鏈接到應(yīng)用程序中。
(3)提高程序啟動(dòng)和運(yùn)行速度。由于動(dòng)態(tài)庫(kù)不需要在編譯時(shí)全部加載到應(yīng)用程序中,可以加快程序的啟動(dòng)和運(yùn)行速度。
(4)更新和維護(hù)更加方便。對(duì)于多個(gè)應(yīng)用程序使用的共享庫(kù),如果需要更新其中的函數(shù)和變量定義,只需要更新庫(kù)文件即可。
Linux動(dòng)態(tài)庫(kù)是一種必備的開(kāi)發(fā)工具,可以提高代碼復(fù)用性,加快程序啟動(dòng)和運(yùn)行速度,方便更新和維護(hù)。在實(shí)際應(yīng)用中,合理使用動(dòng)態(tài)庫(kù)可以極大地提高程序開(kāi)發(fā)效率,加速軟件交付和部署。
相關(guān)問(wèn)題拓展閱讀:
- matlab在linux下生成的動(dòng)態(tài)鏈接庫(kù)怎么用
matlab在linux下生成的動(dòng)態(tài)鏈接庫(kù)怎么用
動(dòng)態(tài)庫(kù)的生成
1>首先生成目標(biāo)文件,但是此時(shí)要加編譯器選項(xiàng)-fpic和鏈接器鬧嫌扮選項(xiàng)-shared,
gcc -fpic -c add.c
gcc -fpic -c sub.c
生成中間文件add.o和sub.o
2>其次生成動(dòng)態(tài)庫(kù)
gcc -shared –o libtiger.so add.o sub.o
生成動(dòng)態(tài)庫(kù)libtiger.so,libtiger.so就是我者梁們生成的目標(biāo)動(dòng)態(tài)庫(kù)。我們以后使用動(dòng)態(tài)庫(kù)和main.c程序生成可執(zhí)行程序
說(shuō)明:
以上兩部也可以合成一步搞定:
gcc -fpic -shared add.c sub.c -o libtiger.so
2.使用動(dòng)態(tài)鏈接庫(kù)
在編譯程序時(shí),使用動(dòng)態(tài)鏈接庫(kù)和靜態(tài)庫(kù)是一致的,使用”-l庫(kù)名”的方式,在生成可執(zhí)行文件的時(shí)候會(huì)鏈接庫(kù)文件。
1>使用命令:
gcc -o main main.c -L ./ -ltiger
2>-L指定動(dòng)態(tài)鏈接庫(kù)的路勁,-ldtiger鏈接庫(kù)函數(shù)tiger。-ltiger是動(dòng)態(tài)庫(kù)的調(diào)用規(guī)則。Linux系統(tǒng)下的動(dòng)態(tài)庫(kù)命名方式是lib*.so,而在鏈接時(shí)表示位-l*,*是自己命名的庫(kù)名。
3>但是程序會(huì)提示如下錯(cuò)誤
error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct
這是因?yàn)槌绦蜻\(yùn)行時(shí)沒(méi)有找到動(dòng)態(tài)鏈接庫(kù)造成的。程序編譯時(shí)鏈接動(dòng)態(tài)庫(kù)和運(yùn)行時(shí)使用動(dòng)態(tài)鏈接庫(kù)的概念是不同的,在運(yùn)行時(shí),程序鏈接的動(dòng)態(tài)鏈接庫(kù)需要在系統(tǒng)目錄下才行。
4>使用以下方法可以解決此問(wèn)題
a. 在linux下最方便的解決方案是拷貝libtiger.so到絕對(duì)目錄 /lib 下液灶(但是,要是超級(jí)用戶才可以,因此要使用sudo哦,親)。就可以生成可執(zhí)行程序了
b.第二種方法是:將動(dòng)態(tài)鏈接庫(kù)的目錄放到程序搜索路徑中,可以將庫(kù)的路徑加到環(huán)境變量LD_LIBRARY_PATH中實(shí)現(xiàn):
export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
關(guān)于linux 動(dòng)態(tài)庫(kù)使用的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
網(wǎng)頁(yè)題目:Linux動(dòng)態(tài)庫(kù):提高代碼復(fù)用性的必備利器(linux動(dòng)態(tài)庫(kù)使用)
URL鏈接:http://www.5511xx.com/article/cdeppgi.html


咨詢
建站咨詢
