什麼叫程式庫
所謂程式庫,一般是軟體作者為了發布方便、替換方便或二次開發目的,而發布的一組可以單獨與應用程式進行compile time
或runtime
鏈結的二進位制可重定位目標碼檔案。通俗一點說,所謂乙個庫,就是乙個檔案,這個檔案可以在編譯時由編譯器直接鏈結到可執行程式中,也可以在執行時由作業系統的
runtime environment根據需要動態載入到記憶體中。一組庫,就形成了乙個發布包,當然,具體發布多少個庫,完全由庫提供商自己決定。
什麼是lib
,什麼是
dll,什麼是
.a,什麼是
.so,什麼是靜態庫,什麼是動態庫
所謂靜態庫,就是在靜態編譯時由編譯器到指定目錄尋找並且進行鏈結,一旦鏈結完成,最終的可執行程式中就包含了該庫檔案中的所有有用資訊,包括**段、資料段等。所謂動態庫,就是在應用程式執行時,由作業系統根據應用程式的請求,動態到指定目錄下尋找並裝載入記憶體中,同時需要進行位址重定向。 win32
平台下,靜態庫通常字尾為
.lib
,動態庫為
.dll 。 linux平台下,靜態庫通常字尾為.a
,動態庫為
.so
從本質上來說,由同一段程式編譯出來的靜態庫和動態庫,在功能上是沒有區別的。不同之處僅僅在於其名字上,也就是「靜態」和「動態」。 由上面的介紹不難看出,相對於動態庫,靜態庫的優點在於直接被鏈結進可執行程式中,之後,該可執行程式就不再依賴於執行環境的設定了(當然仍然會依賴於
cpu指令集和作業系統支援的可執行檔案格式等硬性限制)。而動態庫的優點在於,使用者甚至可以在程式執行時隨時替換該動態庫,這就構成了動態外掛程式系統的基礎。 具體使用靜態庫和動態庫,由程式設計師根據需要自己決定。
補充說明
另外,需要說明的一點是,從底層實現上,動態庫的效率可能會比靜態庫稍差一點點,注意,這裡用了「可能」二字,具體差不差,還得看寫程式的人。之所以可能會差,主要原因在於,程式總無法直接呼叫動態庫中的函式符號,而只能通過呼叫作業系統的runtime environment介面來動態載入某個函式符號,同時獲得該函式符號在記憶體中的位址,將其儲存為函式指標進行呼叫,這就在函式呼叫時增加了一次間接定址的過程。
還是那句話,希望大家都能深入opencv
原始碼庫中去,不要僅僅滿足於會調幾個
api,這樣很難對自己有提高的。深入進去讀原始碼,看看人家是怎麼組織軟體架構的,怎麼劃分模組的。實際上,如果任何乙個軟體體系的層次模組劃分足夠清晰和靈活的話,移植性就不會成為很大的問題,無非就是位元組對齊、部分演算法利用特殊指令集進行優化之類的,這些改動應該僅限於區域性調整,而不用全盤重寫的。軟體架構,很重要的一條就是
open-close
原則,要清楚哪些是可變的哪些是不可變的。就像上面,將來會發生變化的演算法,就可以考慮放到動態庫中,以免將來程式統一全部公升級。
另外,在移植軟體的過程中,保持介面不變是有多重含義的,我們通常知道的是:
1 函式、變數名稱不變
2 函式、變數語法屬性不變(比如乙個宣告為c
形式的函式,必須以
c形式對其進行呼叫,否則由於過載特性會找不到函式名)
3 函式返回值型別不變
4 函式引數個數不變
5 函式引數型別不變
這裡,常常被人們遺忘的,也是最重要的一點是:
保持函式語義不變
這是什麼意思,對於一段程式,除了詞法分析、語法推導之外,還有很重要的一條就是語義分析。簡單來說,對於乙個函式,必須保持移植前後,該函式的返回值含義不變、引數含義不變、函式內部行為的外部表現不變。忽視其中任意一條,都會造成上層應用程式的行為變為未定義,從而移植失敗。
什麼叫程式庫
所謂程式庫,一般是軟體作者為了發布方便 替換方便或二次開發目的,而發布的一組可以單獨與應用程式進行compile time或runtime鏈結的二進位制可重定位目標碼檔案。通俗一點說,所謂乙個庫,就是乙個檔案,這個檔案可以在編譯時由編譯器直接鏈結到可執行程式中,也可以在執行時由作業系統的runtim...
程式庫隨想
我們總是希望有這樣乙個庫 它能夠讓我們方便的完成某個任務,如果a庫使用起來比b庫簡單那麼一點點,我們就更願意使用a。因此,我們也經常幹這樣的事情 把乙個現有的庫做乙個薄封裝,從而使用起來更適合當前的程式設計環境。一般而言,簡單的庫總是更好的,然而這並不是一定的。我總是能聽到一些程式設計師抱怨 為什麼...
重用其他程式庫
重用其他程式庫也會帶來一些不足 需要使用者得到可重用的 需要充分考慮重用後的效率,還要關注由重用其他程式所帶來的潛在名字空間衝突,以及要考慮與可重用程式庫保持版本同步問題。c 撰寫可用的程式庫已屬不易,撰寫可重用的程式庫更是專家級任務。效率並不是最終目標,而擴充套件性 靈活性等其他特性將會比效率更加...