什麼是庫 library

2021-05-23 23:31:35 字數 1682 閱讀 4658

討論 http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4647&start=0&st=0&sk=t&sd=a

[隱藏]

[ 編輯]

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

[ 編輯]

所謂靜態庫,就是在靜態編譯時由編譯器到指定目錄尋找並且進行鏈結,一旦鏈結完成,最終的可執行程式中就包含了該庫檔案中的所有有用資訊,包括**段、資料段等。所謂動態庫,就是在應用程式執行時,由作業系統根據應用程式的請求,動態到指定目錄下尋找並裝載入記憶體中,同時需要進行位址重定向。 win32平台下,靜態庫通常字尾為.lib,動態庫為.dll linux平台下,靜態庫通常字尾為.a,動態庫為.so 從本質上來說,由同一段程式編譯出來的靜態庫和動態庫,在功能上是沒有區別的。不同之處僅僅在於其名字上,也就是「靜態」和「動態」。由上面的介紹不難看出,相對於動態庫,靜態庫的優點在於直接被鏈結進可執行程式中,之後,該可執行程式就不再依賴於執行環境的設定了(當然仍然會依賴於 cpu指令集和作業系統支援的可執行檔案格式等硬性限制)。而動態庫的優點在於,使用者甚至可以在程式執行時隨時替換該動態庫,這就構成了動態外掛程式系統的基礎。具體使用靜態庫和動態庫,由程式設計師根據需要自己決定。

[ 編輯]

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

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

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

函式、變數名稱不變

函式、變數語法屬性不變(比如乙個宣告為c形式的函式,必須以c形式對其進行呼叫,否則由於過載特性會找不到函式名)

函式返回值型別不變

函式引數個數不變

函式引數型別不變

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

保持函式語義不變

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

[ 編輯]

什麼是庫 library

所謂程式庫,一般是軟體作者為了發布方便 替換方便或二次開發目的,而發布的一組可以單獨與應用程式進行compile time或runtime鏈結的二進位制可重定位目標碼檔案。通俗一點說,所謂乙個庫,就是乙個檔案,這個檔案可以在編譯時由編譯器直接鏈結到可執行程式中,也可以在執行時由作業系統的runtim...

什麼是python的庫 什麼是python標準庫

什麼是python標準庫 閱讀 72 python 標準庫非常龐大,所提供的元件涉及範圍十分廣泛,正如以下內容目錄所顯示的。這個庫包含了多個內建模組 以 c 編寫 常用的python標準庫,個人認為分為三類 7大程式設計常用,第三方庫以及常用的科學計算庫.常用的7大庫有 os 作業系統 time 時...

什麼是lib庫

lib有兩種,一種是靜態庫,比如c runtime庫,這種lib中有函式的實現 一般用在靜態連編上,它是將lib中的 加入目標模組 exe或者dll 檔案中,所以鏈結好了之後,lib檔案就沒有用了。一種lib是和dll配合使用的,裡面沒有 在dll中,這種lib是用在靜態呼叫dll上的,所以起的作用...