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

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


咨詢
建站咨詢
