日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux動(dòng)態(tài)庫(kù):提高代碼復(fù)用性的必備利器(linux動(dòng)態(tài)庫(kù)使用)

隨著軟件開(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