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

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


咨詢
建站咨詢
