和luster學習在Linux建立庫函式(2)(轉)
和luster學習在Linux建立庫函式(2)(轉)[@more@]
3. 共享函式庫
共享函式庫中的函式是在當一個可執行程式在啟動的時候被載入。如果一個共享函式庫正常安裝,所有的程式在重新執行的時候都可以自動載入最新的函式庫中的函式。對於Linux系統還有更多的可以實現的功能:
o 升級了函式庫但是仍然允許程式使用老版本的函式庫。
o 當執行某個特定程式的時候可以覆蓋某個特定的庫或者庫中指定的函式。
o 可以在庫函式被使用的過程中修改這些函式庫。
3.1. 一些約定
如果你要編寫的共享函式庫支援所有有用的特性,你在編寫的過程中必須遵循一系列約定。你必須理解庫的不同的名字間的區別,例如它的“soname”和“real name”之間的區別和它們是如何相互作用的。你同樣還要知道你應該把這些庫函式放在你檔案系統的什麼位置等等。下面我們具體看看這些問題。
3.1.1. 共享庫的命名
每個共享函式庫都有個特殊的名字,稱作“soname”。Soname名字命名必須以“lib”作為字首,然後是函式庫的名字,然後是“.so”,最後是版本號資訊。不過有個特例,就是非常底層的C庫函式都不是以lib開頭這樣命名的。
每個共享函式庫都有一個真正的名字(“real name”),它是包含真正庫函式程式碼的檔案。真名有一個主版本號,和一個發行版本號。最後一個發行版本號是可選的,可以沒有。主版本號和發行版本號使你可以知道你到底是安裝了什麼版本的庫函式。
另外,還有一個名字是編譯器編譯的時候需要的函式庫的名字,這個名字就是簡單的soname名字,而不包含任何版本號資訊。
管理共享函式庫的關鍵是區分好這些名字。當可執行程式需要在自己的程式中列出這些他們需要的共享庫函式的時候,它只要用soname就可以了;反過來,當你要建立一個新的共享函式庫的時候,你要指定一個特定的檔名,其中包含很細節的版本資訊。當你安裝一個新版本的函式庫的時候,你只要先將這些函式庫檔案複製到一些特定的目錄中,執行ldconfig這個實用就可以。Ldconfig檢查已經存在的庫檔案,然後建立soname的符號連結到真正的函式庫,同時設定/etc/ld.so.cache這個緩衝檔案。這個我們稍後再討論。
Ldconfig並不設定連結的名字,通常的做法是在安裝過程中完成這個連結名字的建立,一般來說這個符號連結就簡單的指向最新的soname或者最新版本的函式庫檔案。最好把這個符號連結指向soname,因為通常當你升級你的庫函式的後,你就可以自動使用新版本的函式庫勒。
我們來舉例看看:
/usr/lib/libreadline.so.3 是一個完全的完整的soname,ldconfig可以設定一個符號連結到其他某個真正的函式庫檔案,例如是/usr/lib/libreadline.so.3.0。同時還必須有一個連結名字,例如/usr/lib/libreadline.so 就是一個符號連結指向/usr/lib/libreadline.so.3。
待續
luster(luster@linuxaid.com.cn,hwang@ustc.edu)
2001-8-17
3. 共享函式庫
共享函式庫中的函式是在當一個可執行程式在啟動的時候被載入。如果一個共享函式庫正常安裝,所有的程式在重新執行的時候都可以自動載入最新的函式庫中的函式。對於Linux系統還有更多的可以實現的功能:
o 升級了函式庫但是仍然允許程式使用老版本的函式庫。
o 當執行某個特定程式的時候可以覆蓋某個特定的庫或者庫中指定的函式。
o 可以在庫函式被使用的過程中修改這些函式庫。
3.1. 一些約定
如果你要編寫的共享函式庫支援所有有用的特性,你在編寫的過程中必須遵循一系列約定。你必須理解庫的不同的名字間的區別,例如它的“soname”和“real name”之間的區別和它們是如何相互作用的。你同樣還要知道你應該把這些庫函式放在你檔案系統的什麼位置等等。下面我們具體看看這些問題。
3.1.1. 共享庫的命名
每個共享函式庫都有個特殊的名字,稱作“soname”。Soname名字命名必須以“lib”作為字首,然後是函式庫的名字,然後是“.so”,最後是版本號資訊。不過有個特例,就是非常底層的C庫函式都不是以lib開頭這樣命名的。
每個共享函式庫都有一個真正的名字(“real name”),它是包含真正庫函式程式碼的檔案。真名有一個主版本號,和一個發行版本號。最後一個發行版本號是可選的,可以沒有。主版本號和發行版本號使你可以知道你到底是安裝了什麼版本的庫函式。
另外,還有一個名字是編譯器編譯的時候需要的函式庫的名字,這個名字就是簡單的soname名字,而不包含任何版本號資訊。
管理共享函式庫的關鍵是區分好這些名字。當可執行程式需要在自己的程式中列出這些他們需要的共享庫函式的時候,它只要用soname就可以了;反過來,當你要建立一個新的共享函式庫的時候,你要指定一個特定的檔名,其中包含很細節的版本資訊。當你安裝一個新版本的函式庫的時候,你只要先將這些函式庫檔案複製到一些特定的目錄中,執行ldconfig這個實用就可以。Ldconfig檢查已經存在的庫檔案,然後建立soname的符號連結到真正的函式庫,同時設定/etc/ld.so.cache這個緩衝檔案。這個我們稍後再討論。
Ldconfig並不設定連結的名字,通常的做法是在安裝過程中完成這個連結名字的建立,一般來說這個符號連結就簡單的指向最新的soname或者最新版本的函式庫檔案。最好把這個符號連結指向soname,因為通常當你升級你的庫函式的後,你就可以自動使用新版本的函式庫勒。
我們來舉例看看:
/usr/lib/libreadline.so.3 是一個完全的完整的soname,ldconfig可以設定一個符號連結到其他某個真正的函式庫檔案,例如是/usr/lib/libreadline.so.3.0。同時還必須有一個連結名字,例如/usr/lib/libreadline.so 就是一個符號連結指向/usr/lib/libreadline.so.3。
待續
luster(luster@linuxaid.com.cn,hwang@ustc.edu)
2001-8-17
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10796304/viewspace-962577/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 和luster學習在Linux建立庫函式(6)(轉)Linux函式
- 和luster學習在Linux建立庫函式(4)(轉)Linux函式
- 和luster學習在Linux建立庫函式(1)(轉)Linux函式
- 【從零開始學習 MySql 資料庫】(2) 函式MySql資料庫函式
- 【從零開始學習Oracle資料庫】(2)函式Oracle資料庫函式
- 2. PHP 函式學習 stripos ()PHP函式
- 在Linux中建立靜態庫和動態庫Linux
- 函式學習函式
- Python(2):建立函式模組Python函式
- 【Mysql 學習】日期函式函式MySql函式
- 字串函式庫的經典使用學習字串函式
- Js函式和物件學習體會JS函式物件
- mysql日期和時間函式學習MySql函式
- spark RDD的學習,filter函式的學習,split函式的學習SparkFilter函式
- GNU/linux的C函式庫介紹(轉)Linux函式
- 利用回撥函式和CSocket建立網路程式 (轉)函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- MySQL函式學習(一)-----字串函式MySql函式字串
- 轉 Lua標準庫: table函式, 數學函式, 字串函式/格式化/配對,函式字串
- 物聯網學習教程—函式引數和函式的值函式
- 函式學習五函式
- 函式學習六函式
- 函式學習三函式
- 函式學習四函式
- 函式學習二函式
- 函式的學習函式
- 學習Rust 函式Rust函式
- 學習dump函式函式
- ORACLE函式學習Oracle函式
- 分析函式學習2 SYS_CONNECT_BY_PATH函式
- FreeRTOS學習記錄--任務建立函式詳解函式
- c語言學習--time庫函式詳解C語言函式
- 檔案和目錄之stat族函式——APUE學習筆記(2)函式筆記
- linux庫函式升級權威經驗(轉)Linux函式
- 11g文件學習2----建立資料庫資料庫
- C++程式設計學習筆記:2 類和物件初探 內聯成員函式和過載成員函式C++程式設計筆記物件函式
- Linux程式建立函式vfork簡介Linux函式
- 2. 流程控制 與 函式 |《 刻意學習 Golang 》函式Golang