close
什麼叫程式庫

所謂程式庫,一般是軟體作者為了發佈方便、替換方便或二次開發目的,而發佈的一組可以單獨與應用程式進行compile time或runtime鏈接的二進位可重定位目標碼文件。通俗一點說,所謂一個庫,就是一個文件,這個文件可以在編譯時由編譯器直接鏈接到可執行程式 中,也可以在運行時由操作系統的runtime enviroment根據需要動態載入到記憶體中。一組庫,就形成了一個發佈包,當然,具體發佈多少個庫,完全由庫提供商自己決定。

Standard Library

Standard Library,中文常稱標準函式庫。常會與程式語言一起稱呼,例如 C/C++ Standard Library 或 Python Standard Library。通常是指某個程式語言的預設/基本的函式庫集合,會蒐集常用的函式庫,使之成為安裝後即可使用的函式庫。

Runtime Library

有很多函式庫的功能不是編譯後就確定好的,必須在程式在執行期才會確定,例如 C++ 的 std::type_info 是在程式執行期間查詢物件型別。不同於 macro 的定義,因為 macro 是在程式編譯時期就已經確定的。

也有人用 Library 與主程式連結(link)的時期來做區別。Library 與主程式連結(link)的時期分為 Static link(靜態編譯) 及 Dynamic link(動態編譯)。Static link 表示主程式執行時,連結 Library 的時期是靜態的,不屬於 Runtime Library。而 Dynamic link (或稱 Shared library) 是主程式執行時,等到需要呼叫 Library 時才會連結(link) 的,這才屬於 Runtime Library。

什麼是lib,什麼是dll,什麼是.a,什麼是.so,什麼是靜態庫,什麼是動態庫

所謂,就是在靜態編譯時到指定目錄尋找並且進行鏈接,一旦鏈接完成,最終的可執行程式中就包含了該庫文件中的所有有用信息,包括代碼 段、數據段等。所謂,就是在應用程式運行時,由根據應用程式的請求,動態到指定目錄下尋找並裝載入記憶體中,同時需要進行地址重定向。 win32平臺下,靜態庫通常尾碼為.lib,動態庫為.dll linux平臺下,靜態庫通常尾碼為.a,動態庫為.so 從本質上來說,由同一段程式編譯出來的靜態庫和動態庫,在功能上是沒有區別的。不同之處僅僅在於其名字上,也就是“靜態”和“動態”。 由上面的介紹不難看出,相對於動態庫,靜態庫的優點在於直接被鏈接進可執行程式中,之後,該可執行程式就不再依賴於運行環境的設置了(當然仍然會依賴於 CPU指令集和操作系統支持的可執行文件格式等硬性限制)。而動態庫的優點在於,用戶甚至可以在程式運行時隨時替換該動態庫,這就構成了動態插件系統的基 礎。 具體使用靜態庫和動態庫,由程式員根據需要自己決定。

另外,需要說明的一點是,從底層實現上,動態庫的效率可能會比靜態庫稍差一點點,註意,這裡用了“可能”二字,具體差不差,還得看寫程式的人。之所 以可能會差,主要原因在於,程式總無法直接調用動態庫中的函數符號,而只能通過調用操作系統的runtime enviroment介面來動態載入某個函數符號,同時獲得該函數符號在記憶體中的地址,將其保存為函數指針進行調用,這就在函數調用時增加了一次間接定 址的過程。

還是那句話,希望大家都能深入opencv源碼庫中去,不要僅僅滿足於會調幾個API,這樣很難對自己有提高的。深入進去讀源碼,看看人家 是怎麼組織軟體架構的,怎麼劃分模塊的。實際上,如果任何一個軟體體系的層次模塊劃分足夠清晰和靈活的話,移植性就不會成為很大的問題,無非就是位元組對 齊、部分演算法利用特殊指令集進行優化之類的,這些改動應該僅限於局部調整,而不用全盤重寫的。軟體架構,很重要的一條就是open-close 原則,要清楚哪些是可變的哪些是不可變的。就像上面,將來會發生變化的演算法,就可以考慮放到動態庫中,以免將來程式統一全部升級。

另外,在移植軟體的過程中,保持介面不變是有多重含義的,我們通常知道的是:

  1. 函數、變數名稱不變
  2. 函數、變數語法屬性不變(比如一個聲明為C形式的函數,必須以C形式對其進行調用,否則由於重載特性會找不到函數名)
  3. 函數返回值類型不變
  4. 函數參數個數不變
  5. 函數參數類型不變

這裡,常常被人們遺忘的,也是最重要的一點是:

保持函數語義不變

這是什麼意思,對於一段程式,除了詞法分析、語法推導之外,還有很重要的一條就是語義分析。簡單來說,對於一個函數,必須保持移植前後,該 函數的返回值含義不變、參數含義不變、函數內部行為的外部表現不變。忽視其中任意一條,都會造成上層應用程式的行為變為未定義,從而移植失敗。


本文轉自:http://antbsd.twbbs.org/~ant/wordpress/?p=1714&http://www.opencv.org.cn/index.php?title=%E4%BB%80...

arrow
arrow
    全站熱搜

    S 發表在 痞客邦 留言(0) 人氣()