新聞中心
Linux作為一種自由、開(kāi)源、免費(fèi)的操作系統(tǒng),已經(jīng)成為了企業(yè)開(kāi)發(fā)、運(yùn)維和云計(jì)算領(lǐng)域的首選。而Linux動(dòng)態(tài)庫(kù)則是這個(gè)操作系統(tǒng)的重要組成部分,用于實(shí)現(xiàn)程序的模塊化編程和共享使用。近年來(lái),Linux動(dòng)態(tài)庫(kù)的一個(gè)新特性——版本信息管理受到了廣泛的關(guān)注和應(yīng)用。在本文中,我們將重點(diǎn)介紹這個(gè)新特性的相關(guān)內(nèi)容和應(yīng)用場(chǎng)景。

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),先為富順等服務(wù)建站,富順等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為富順企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
一、動(dòng)態(tài)庫(kù)的基本概念和分類
在Linux操作系統(tǒng)中,動(dòng)態(tài)庫(kù)是一種可以在程序運(yùn)行時(shí)載入的共享庫(kù),為不同的程序提供了共享的代碼庫(kù)。相比于靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)可以在程序運(yùn)行時(shí)才進(jìn)行鏈接,減小了程序的大小,提高了可重用性。在Linux中,動(dòng)態(tài)庫(kù)可以通過(guò)各種編程語(yǔ)言(如C、C++、Java等)進(jìn)行編寫(xiě),并且按照庫(kù)的類型也可以分為以下幾種:
1. 共享目標(biāo)文件:使用C編寫(xiě)、擴(kuò)展名為.so的動(dòng)態(tài)庫(kù),是最常用的動(dòng)態(tài)庫(kù)類型。
2. 共享代碼庫(kù):使用C++編寫(xiě)、擴(kuò)展名為.so的動(dòng)態(tài)庫(kù),主要用于C++的動(dòng)態(tài)類型庫(kù)機(jī)制,支持面向?qū)ο蟮木幊獭?/p>
3. 共享Java虛擬機(jī)庫(kù):使用Java編寫(xiě)、擴(kuò)展名為.so的動(dòng)態(tài)庫(kù),用于Java語(yǔ)言的動(dòng)態(tài)鏈接使用。
二、動(dòng)態(tài)庫(kù)的版本管理
在實(shí)際的開(kāi)發(fā)中,隨著動(dòng)態(tài)庫(kù)的版本不斷更新,會(huì)帶來(lái)版本兼容性問(wèn)題。比如,一個(gè)程序在使用某個(gè)動(dòng)態(tài)庫(kù)的新版本時(shí),如果該程序所需的函數(shù)或變量名稱或類型發(fā)生了改變,那么該程序可能無(wú)法正常鏈接和執(zhí)行。為了解決這個(gè)問(wèn)題,Linux引入了動(dòng)態(tài)庫(kù)版本管理的概念。動(dòng)態(tài)庫(kù)版本管理通過(guò)在庫(kù)文件名中添加版本信息的方式,實(shí)現(xiàn)對(duì)動(dòng)態(tài)庫(kù)的不同版本進(jìn)行管理和使用。
對(duì)于Linux動(dòng)態(tài)庫(kù)的版本管理,可以從兩個(gè)方面來(lái)理解:
1. 動(dòng)態(tài)庫(kù)的版本號(hào)
動(dòng)態(tài)庫(kù)的版本號(hào)可以分為兩個(gè)部分:主版本號(hào)和次版本號(hào),分別用點(diǎn)“.”分隔。其中,主版本號(hào)表示庫(kù)的重大更新和API的改變,而次版本號(hào)則表示庫(kù)的較小更新和API的增加。例如,一個(gè)庫(kù)的版本為1.0,表示這個(gè)庫(kù)是主版本1,次版本0。
動(dòng)態(tài)庫(kù)的版本號(hào)通常會(huì)寫(xiě)在庫(kù)文件名的后面,格式為“庫(kù)名.so.主版本號(hào).次版本號(hào)”。例如,庫(kù)libfoo的版本號(hào)為1.0,則其庫(kù)文件名應(yīng)該是“l(fā)ibfoo.so.1.0”。這樣,當(dāng)庫(kù)的版本發(fā)生變化時(shí),新的庫(kù)文件名就可以放在舊版庫(kù)文件名的旁邊,不影響已有軟件的運(yùn)行。例如,庫(kù)libfoo的新版本是1.1,則其庫(kù)文件名應(yīng)該是“l(fā)ibfoo.so.1.1”,而庫(kù)文件“l(fā)ibfoo.so.1.0”則仍然存在。
2. 動(dòng)態(tài)庫(kù)的符號(hào)版本
除了動(dòng)態(tài)庫(kù)的版本號(hào)外,Linux還支持動(dòng)態(tài)庫(kù)中函數(shù)和變量的符號(hào)版本管理。符號(hào)版本可以理解為動(dòng)態(tài)庫(kù)接口的一個(gè)標(biāo)識(shí),是由動(dòng)態(tài)庫(kù)開(kāi)發(fā)者來(lái)決定的。應(yīng)用程序鏈接時(shí)只需要依賴符號(hào)版本,而不是依賴動(dòng)態(tài)庫(kù)的特定版本。這使得應(yīng)用程序更加靈活,可以鏈接任意版本的同樣的動(dòng)態(tài)庫(kù)。
動(dòng)態(tài)庫(kù)的符號(hào)版本通常在庫(kù)函數(shù)聲明語(yǔ)句的前面添加一個(gè)版本號(hào),格式為“函數(shù)名@VER”。例如,一個(gè)庫(kù)的版本為1.0,其函數(shù)foo的符號(hào)版本為“foo@VER_1.0”。這樣,在應(yīng)用程序鏈接時(shí),就可以使用庫(kù)函數(shù)的符號(hào)版本來(lái)確定函數(shù)的調(diào)用。
三、動(dòng)態(tài)庫(kù)版本管理的應(yīng)用場(chǎng)景
如前所述,動(dòng)態(tài)庫(kù)版本管理可以有效解決庫(kù)版本兼容性的問(wèn)題。同時(shí),這種管理方式還可以帶來(lái)以下顯著優(yōu)點(diǎn):
1. 安裝和更新方便
按版本號(hào)命名的動(dòng)態(tài)庫(kù)不會(huì)與舊版本的動(dòng)態(tài)庫(kù)發(fā)生沖突,可以更方便地安裝和更新。同時(shí),應(yīng)用程序也可以保持對(duì)舊版本和新版本的庫(kù)的鏈接。
2. 動(dòng)態(tài)鏈接和動(dòng)態(tài)加載的更好支持
由于可以在庫(kù)中添加符號(hào)版本,因此,應(yīng)用程序可以鏈接到任意版本的動(dòng)態(tài)庫(kù),而不需要知道庫(kù)的確切版本。動(dòng)態(tài)加載也可以更好地支持,只需要依賴動(dòng)態(tài)庫(kù)的符號(hào)版本,而不需要依賴特定版本的庫(kù)。
3. 庫(kù)的多版本支持
使用動(dòng)態(tài)庫(kù)的版本管理技術(shù),還可以實(shí)現(xiàn)多版本的庫(kù)共存。例如,不同版本的庫(kù)可以被不同的應(yīng)用程序所使用,且不會(huì)發(fā)生沖突。
四、
動(dòng)態(tài)庫(kù)版本管理是Linux系統(tǒng)的一個(gè)重要特性,通過(guò)添加版本信息,可以實(shí)現(xiàn)對(duì)動(dòng)態(tài)庫(kù)版本的管理和使用。該技術(shù)在解決庫(kù)版本兼容性問(wèn)題方面起到了非常重要的作用。同時(shí),動(dòng)態(tài)庫(kù)的版本管理還可以帶來(lái)諸多優(yōu)點(diǎn),如方便的安裝和更新、更好地支持動(dòng)態(tài)鏈接和動(dòng)態(tài)加載以及庫(kù)的多版本支持等。當(dāng)然,該技術(shù)也存在一些局限性,如在不同平臺(tái)之間移植時(shí)需要考慮到不同的版本信息。因此,在實(shí)際應(yīng)用中需要根據(jù)具體情況進(jìn)行權(quán)衡和選擇,以達(dá)到更優(yōu)化的效果。
相關(guān)問(wèn)題拓展閱讀:
- 關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題
- linux動(dòng)態(tài)庫(kù)函數(shù)重名的問(wèn)題
- 如何讓linux加載當(dāng)前目錄的動(dòng)態(tài)庫(kù)
關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題
gcc編譯時(shí),當(dāng)使用動(dòng)態(tài)庫(kù)編譯可以按照幾種寫(xiě)法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數(shù)都是按照2或3去寫(xiě)
2寫(xiě)法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫(kù),即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進(jìn)行鏈接,當(dāng)然如果沒(méi)有動(dòng)態(tài)庫(kù)升咐就會(huì)去找靜態(tài)庫(kù),再?zèng)]有應(yīng)該就會(huì)在編譯時(shí)報(bào)錯(cuò)
3寫(xiě)法的含義是從-L參數(shù)首先從指定的目錄中尋找需要鏈接的庫(kù)文件,隨后再去尋找系統(tǒng)文件夾中是否存在需要的庫(kù)
1寫(xiě)法的含義是將當(dāng)前目錄下的./libSDL2-2.so.0文件鏈接進(jìn)最終文件,因此執(zhí)行readelf -a a.out后在動(dòng)態(tài)庫(kù)部分所看到的路徑就是./libSDL2-2.so.0,進(jìn)而在執(zhí)行文件時(shí)僅會(huì)從當(dāng)前目錄下尋找libSDL2-2.so.0文件,當(dāng)執(zhí)行文件時(shí)所在的目錄下沒(méi)有該文件時(shí)就會(huì)出現(xiàn)找不到庫(kù)文件的操作吵困純
你第二次操作時(shí),因?yàn)閒unction.so庫(kù)文件與a.out文件在同一個(gè)目錄,同時(shí)也是在該目錄下執(zhí)行的ldd操作及運(yùn)行a.out,a.out在加載動(dòng)態(tài)庫(kù)時(shí)從當(dāng)前目錄下找到了所需要的庫(kù)文件,此時(shí)能夠執(zhí)行成功(ldd命令實(shí)質(zhì)是一個(gè)腳本,通過(guò)設(shè)置環(huán)境變量運(yùn)行動(dòng)態(tài)庫(kù)鏈接器來(lái)輸出所有待鏈接的動(dòng)態(tài)庫(kù))。
你可以試試將a.out拷貝至其他目錄再次運(yùn)行,將出現(xiàn)和之一次操作時(shí)一樣的現(xiàn)象,找不到function.so文件。
具體的解決方法就是修改編譯參數(shù),將./libSDL2-2.so.0修改為-lSDL2-2并將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,并且可能因?yàn)闆](méi)有修改鏈接器的緩存文件(將可能找不到帶版本號(hào)后綴的動(dòng)態(tài)庫(kù)),需要在/usr/lib目錄下建立一個(gè)文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或尺游者直接修改名稱為libSDL2-2.so
很橋野奇怪的游消塵gcc用法, 鏈接庫(kù)的時(shí)候你應(yīng)該神禪使用選項(xiàng)”-l”來(lái)指定, 而不是像個(gè)c文件一樣直接寫(xiě)在后面.
/etc/ld.so.conf 里或者環(huán)境高閉變山搜量里添加庫(kù)路徑,或者要戚唯裂把文件放到/usr/lib這樣的路徑里面,再更新一下ld.so.conf文件
linux動(dòng)態(tài)庫(kù)函數(shù)重名的問(wèn)題
Linux下動(dòng)態(tài)庫(kù)文件的擴(kuò)展名為”.so”(Shared Object)。按照約定,所有動(dòng)態(tài)庫(kù)文件名的尺兆形式是libname.so(可能在名字中加入版本號(hào))。這樣,線程函數(shù)庫(kù)被稱作libthread.so。靜態(tài)庫(kù)的文件名形式是libname.a。共享archive的文件名形式是libname.sa。共享archive只是一種過(guò)渡形式,幫助人們從靜態(tài)庫(kù)轉(zhuǎn)變到動(dòng)態(tài)庫(kù)。
本文僅以簡(jiǎn)單的例子介紹動(dòng)態(tài)庫(kù)文件判皮的生成和鏈接方法。
操作系陵沖租統(tǒng):Debian/GNU Linux 2.6.;
GCC版本:4.1.3
一、庫(kù)文件及測(cè)試文件代碼
庫(kù)文件及測(cè)試文件所在的目錄:/home/program/。
1.庫(kù)文件名:myfunction.c
/*Author: Godbach
E-mail:
*/
#include
int
my_lib_function (void)
{
printf (“Library routine called from libmyfunction.so!
“);
return 0;
}
2.測(cè)試文件名:test.c
#include
int main(void)
{
my_lib_function();
return 0;
}
二、動(dòng)態(tài)庫(kù)的編譯方法
編譯庫(kù)文件myfunction.c:
debian:/home/program# gcc -shared -o libmyfunction.so myfunction.c
如果編譯成功,會(huì)在/home/program/下生成動(dòng)態(tài)庫(kù)文件:libmyfunction.so。
這里有兩點(diǎn)需要說(shuō)明:
1.對(duì)Linux操作,一般都推薦在普通用戶模式下,如果需要超級(jí)用戶的權(quán)限,則可以通過(guò)su root,輸入root用戶密碼切換。我是個(gè)人學(xué)習(xí)使用,同時(shí)又有很多的操作都要使用root用戶,因此就直接在root用戶下進(jìn)行編譯。
2.編譯生成動(dòng)態(tài)庫(kù)的命令為:gcc (-fpic) -shared -o libmyfunction.so myfunction.c
-fpic 使輸出的對(duì)象模塊是按照可重定位地址方式生成的。
-shared指定把對(duì)應(yīng)的源文件生成對(duì)應(yīng)的動(dòng)態(tài)鏈接庫(kù)文件。
三、動(dòng)態(tài)庫(kù)的測(cè)試方法
編譯測(cè)試文件test.c:
debian:/home/program# gcc -o test test.c /home/program/libmyfunction.so
成功編譯后,生成test文件,運(yùn)行test:
debian:/home/program# ./test
Library routine called from libmyfunction.so!
其中,gcc -o test test.c /home/program/libmyfunction.so的最后一個(gè)參數(shù)指定所鏈接庫(kù)文件的絕對(duì)路徑。本例中庫(kù)文件的絕對(duì)路徑為:/home/program/libmyfunction.so。
當(dāng)然,如果想從系統(tǒng)的庫(kù)文件路徑(通常系統(tǒng)函數(shù)庫(kù)的位于/usr/lib下)鏈接動(dòng)態(tài)庫(kù)的話,可以先將生成的庫(kù)文件拷貝至/usr/lib/下,然后再鏈接:
debian:/home/program# cp libmyfunction.so /usr/lib/
debian:/home/program# gcc -o test test.c -lmyfunction
debian:/home/program# ./test
Library routine called from libmyfunction.so!
這里,對(duì)于鏈接的方法作一下解釋。對(duì)于gcc -o test test.c -lmyfunction中最后一個(gè)參數(shù)-lmyfunction, 可見(jiàn)傳給C編譯器的命令行參數(shù)并未提到函數(shù)庫(kù)的完整路徑名,甚至沒(méi)有提到在函數(shù)庫(kù)目錄中該文件的完整名字!實(shí)際上,編譯器被告知根據(jù)選項(xiàng)-lmyfunction鏈接到相應(yīng)的函數(shù)庫(kù)(/usr/lib下),函數(shù)庫(kù)的名字是libmyfunction.so, 也就是說(shuō),”lib”部分和文件的擴(kuò)展名被省略了,但在前面加了一個(gè)l。
如何讓linux加載當(dāng)前目錄的動(dòng)態(tài)庫(kù)
讓linux加載冊(cè)模當(dāng)前目錄的動(dòng)態(tài)庫(kù),設(shè)置方法有以下三種:
1、臨時(shí)修改,log out之后就失效
在terminal中執(zhí)行:
export LD_LIBRARY_PATH=./
2、讓當(dāng)前帳號(hào)以雀擾后都優(yōu)先加載當(dāng)前目錄的動(dòng)態(tài)庫(kù)
修改~/.bash_profile 在州歲緩文件末尾加上兩行:
LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
3、讓所有帳號(hào)從此都優(yōu)先加載當(dāng)前目錄的動(dòng)態(tài)庫(kù)
修改/etc/profile 在文件末尾加上兩行:
LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
linux動(dòng)態(tài)庫(kù)加入版本信息的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux動(dòng)態(tài)庫(kù)加入版本信息,Linux動(dòng)態(tài)庫(kù)新特性:版本信息管理,關(guān)于linux下連接動(dòng)態(tài)庫(kù)問(wèn)題,linux動(dòng)態(tài)庫(kù)函數(shù)重名的問(wèn)題,如何讓linux加載當(dāng)前目錄的動(dòng)態(tài)庫(kù)的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享名稱:Linux動(dòng)態(tài)庫(kù)新特性:版本信息管理(linux動(dòng)態(tài)庫(kù)加入版本信息)
地址分享:http://m.fisionsoft.com.cn/article/cdhiopi.html


咨詢
建站咨詢
