共享庫版本命名
Linux 有一套規(guī)則來命名系統(tǒng)中的每一個共享庫限府。它規(guī)定系統(tǒng)中的每一個動態(tài)庫命名規(guī)則必須如下:
libname.so.x.y.z
- 最前面使用前綴
lib
,中間是庫的名字和后綴.so
岖常,最后面跟著三個數(shù)字組成的版本號髓绽。 -
x
表示主版本號 -
y
表示次版本號 -
z
表示發(fā)布版本號
主版本號表示庫的重大升級,不同主版本號之間是不兼容的叽赊。
次版本號表示庫的增量升級恋沃,即增加一些新的接口符號,且保持原來的符號不變必指。
發(fā)布版本號表示庫的一些錯誤修正囊咏,性能的改進(jìn),并不添加任何新的接口塔橡。
SO-NAME
每一個共享庫都有一個對應(yīng)的SO-NAME
梅割,這個SO-NAME
即共享庫的文件名去掉次版本號和發(fā)布版本號,保留主版本號葛家。
在Linux 中户辞,系統(tǒng)會為每一個共享庫在它所在的目錄創(chuàng)建一個 跟"SO-NAME"相同并且指向它的軟鏈接,比如系統(tǒng)種有存在一個共享庫/lib/libfoo.so.2.6.1
癞谒,那么Linux共享庫管理程序就會為它產(chǎn)生一個軟鏈接/lib/libfoo.so.2
指向它底燎。
那么以"SO-NAME"創(chuàng)建軟鏈接有什么好處呢?
這個軟鏈接會指向目錄種版本號相同扯俱,次版本號和發(fā)布版本號最新的共享庫书蚪。
建立以"SO-NAME"為名字的軟鏈接的目的是:使得所有依賴某個共享庫的模塊,在編譯鏈接迅栅,
鏈接名
共享庫的查找過程
共享庫的系統(tǒng)路徑
目前在內(nèi)的大多是Linux 操作系統(tǒng)都遵守一個叫做FHS的標(biāo)準(zhǔn)殊校,這個標(biāo)準(zhǔn)規(guī)定iyge系統(tǒng)種的系統(tǒng)文件應(yīng)該如何存放,包括各個目錄的結(jié)構(gòu)读存,組織和作用为流。FHS 規(guī)定一個系統(tǒng)中主要有3個存放共享庫的位置呕屎。
- /lib
存放系統(tǒng)最關(guān)鍵的基礎(chǔ)的共享庫,比如動態(tài)鏈接器敬察,C語言運行庫秀睛,數(shù)學(xué)庫。 - /usr/lib
保存一些開發(fā)相關(guān)的庫莲祸。 - /usr/local/lib
主要存放一些第三方應(yīng)用程序的的庫蹂安。
在開源系統(tǒng)中,動態(tài)鏈接器是/lib/ld-linux.so.X
锐帜,程序所依賴的共享對象全部由動態(tài)鏈接器負(fù)責(zé)裝載和初始化田盈。
共享庫的創(chuàng)建和安裝
共享庫的創(chuàng)建
創(chuàng)建共享庫最關(guān)鍵是使用2個參數(shù):
-fPIC
表示使用地址無關(guān)代碼的技術(shù)來生產(chǎn)輸出文件。
-shared
表示輸出結(jié)果是共享庫的類型缴阎。
共享庫的安裝
最簡單的方法就是將共享庫復(fù)制到某個標(biāo)準(zhǔn)的共享庫目錄允瞧,如/lib
和/usr/lib
,然后運行ldconfig
命令即可