什麼叫程序庫?

什麼叫程序庫程序員

所謂程序庫,通常是軟件做者爲了發佈方便、替換方便或二次開發目的,而發佈的一組能夠單獨與應用程序進行compile timeruntime連接的二進制可重定位目標碼文件。通俗一點說,所謂一個庫,就是一個文件,這個文件能夠在編譯時由編譯器直接連接到可執行程序中,也能夠在運行時由操做系統的runtime environment根據須要動態加載到內存中。一組庫,就造成了一個發佈包,固然,具體發佈多少個庫,徹底由庫提供商本身決定。算法

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

所謂靜態庫,就是在靜態編譯時由編譯器到指定目錄尋找而且進行連接,一旦連接完成,最終的可執行程序中就包含了該庫文件中的全部有用信息,包括代碼段、數據段等。所謂動態庫,就是在應用程序運行時,由操做系統根據應用程序的請求,動態到指定目錄下尋找並裝載入內存中,同時須要進行地址重定向。 win32平臺下,靜態庫一般後綴爲.lib,動態庫爲.dll 。 Linux平臺下,靜態庫一般後綴爲.a,動態庫爲.so 從本質上來講,由同一段程序編譯出來的靜態庫和動態庫,在功能上是沒有區別的。不一樣之處僅僅在於其名字上,也就是「靜態」和「動態」。 由上面的介紹不難看出,相對於動態庫,靜態庫的優勢在於直接被連接進可執行程序中,以後,該可執行程序就再也不依賴於運行環境的設置了(固然仍然會依賴於 CPU指令集和操做系統支持的可執行文件格式等硬性限制)。而動態庫的優勢在於,用戶甚至能夠在程序運行時隨時替換該動態庫,這就構成了動態插件系統的基礎。 具體使用靜態庫和動態庫,由程序員根據須要本身決定。函數

補充說明優化

另外,須要說明的一點是,從底層實現上,動態庫的效率可能會比靜態庫稍差一點點,注意,這裏用了「可能」二字,具體差不差,還得看寫程序的人。之因此可能會差,主要緣由在於,程序總沒法直接調用動態庫中的函數符號,而只能經過調用操做系統的runtime environment接口來動態載入某個函數符號,同時得到該函數符號在內存中的地址,將其保存爲函數指針進行調用,這就在函數調用時增長了一次間接尋址的過程。spa

仍是那句話,但願你們都能深刻opencv源碼庫中去,不要僅僅知足於會調幾個API,這樣很難對本身有提升的。深刻進去讀源碼,看看人家是怎麼組織軟件架構的,怎麼劃分模塊的。實際上,若是任何一個軟件體系的層次模塊劃分足夠清晰和靈活的話,移植性就不會成爲很大的問題,無非就是字節對齊、部分算法利用特殊指令集進行優化之類的,這些改動應該僅限於局部調整,而不用全盤重寫的。軟件架構,很重要的一條就是open-close 原則,要清楚哪些是可變的哪些是不可變的。就像上面,未來會發生變化的算法,就能夠考慮放到動態庫中,以避免未來程序統一所有升級。操作系統

另外,在移植軟件的過程當中,保持接口不變是有多重含義的,咱們一般知道的是:插件

1 函數、變量名稱不變指針

2 函數、變量語法屬性不變(好比一個聲明爲C形式的函數,必須以C形式對其進行調用,不然因爲重載特性會找不到函數名)接口

3 函數返回值類型不變

4 函數參數個數不變

5 函數參數類型不變

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

保持函數語義不變

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

相關文章
相關標籤/搜索