摘要:和luster學習在Linux創建庫函數
共享函數庫
共享函數庫中的函數是在當一個可執行程序在啟動的時候被加載
如果一個共享函數庫正常安裝
所有的程序在重新運行的時候都可以自動加載最新的函數庫中的函數
對於Linux系統還有更多的可以實現的功能
o 升級了函數庫但是仍然允許程序使用老版本的函數庫
o 當執行某個特定程序的時候可以覆蓋某個特定的庫或者庫中指定的函數
o 可以在庫函數被使用的過程中修改這些函數庫
一些約定
如果你要編寫的共享函數庫支持所有有用的特性
你在編寫的過程中必須遵循一系列約定
你必須理解庫的不同的名字間的區別
例如它的
soname
和
real name
之間的區別和它們是如何相互作用的
你同樣還要知道你應該把這些庫函數放在你文件系統的什麼位置等等
下面我們具體看看這些問題
共享庫的命名
每個共享函數庫都有個特殊的名字
稱作
soname
Soname名字命名必須以
lib
作為前綴
然後是函數庫的名字
然後是
so
最後是版本號信息
不過有個特例
就是非常底層的C庫函數都不是以lib開頭這樣命名的
每個共享函數庫都有一個真正的名字(
real name
)
它是包含真正庫函數代碼的文件
真名有一個主版本號
和一個發行版本號
最後一個發行版本號是可選的
可以沒有
主版本號和發行版本號使你可以知道你到底是安裝了什麼版本的庫函數
另
外
還有一個名字是編譯器編譯的時候需要的函數庫的名字
這個名字就是簡單的soname名字
而不包含任何版本號信息
管理共享函數庫的關鍵是區分好這些名字
當可執行程序需要在自己的程序中列出這些他們需要的共享庫函數的時候
它只要用soname就可以了
反過來
當你要創建一個新的共享函數庫的時候
你要指定一個特定的文件名
其中包含很細節的版本信息
當你安裝一個新版本的函數庫的時候
你只要先將這些函數庫文件拷貝到一些特定的目錄中
運行ldconfig這個實用就可以
Ldconfig檢查已經存在的庫文件
然後創建soname的符號鏈接到真正的函數庫
同時設置/etc/ld
so
cache這個緩沖文件
這個我們稍後再討論
Ldconfig並不設置鏈接的名字
通常的做法是在安裝過程中完成這個鏈接名字的建立
一般來說這個符號鏈接就簡單的指向最新的soname或者最新版本的函數庫文件
最好把這個符號鏈接指向soname
因為通常當你升級你的庫函數的後
你就可以自動使用新版本的函數庫勒
我們來舉例看看
/usr/lib/libreadline
so
是一個完全的完整的soname
ldconfig可以設置一個符號鏈接到其他某個真正的函數庫文件
例如是/usr/lib/libreadline
so
同時還必須有一個鏈接名字
例如/usr/lib/libreadline
so 就是一個符號鏈接指向/usr/lib/libreadline
so
待續
luster(
cn
hwang@ustc
edu)
From:http://tw.wingwit.com/Article/program/Oracle/201311/17922.html