剛好在複習Golang的時候看到Go有支援載入C Language的Static Library與Shared Libraries,於是來複習一下他們之間的差異
介紹
首先要先了解,Library的意義,就單純為一個檔案
將會共用的程式碼打包再一起的檔案就稱為Library
假設現在若要使用print這個方法來印出東西在螢幕,
故可以將print編譯成Library,供各個開發者直接使用,不用讓開發者自己定義print方法,要煩惱如何與OS溝通並印出畫面的邏輯程式碼
Static Library
Static Libarary通常為我們自己寫好的程式碼,經過Compile之後,所得到的就是 Static Library
Shared則是我們也是將程式碼經過Compile,也是得到 Shared Library
聽起來過程都很像,那到底差異在哪?
其實從字面上曉得,從使用其意義來解釋
在專案程式使用其Static Library時,該專案進行Compile,Compiler會在Compile Time時將Static Library的程式碼給"複製"到專案程式碼中。
假如我們Static Lib中有個print()
方法,那專案Compile時就會把print()
方法copy到APP中,APP啟動時就會有print()
方法
1 | CODE (import static lib) -> Compiled STATIC Lib |
Shared Library
顧名思義就是直接共享Library內的程式碼
當專案使用的是Shared Library,那專案進行Compile時,Compiler會去Link
Shared Libaray的方法,而不是用複製的。
假如Shared Library Lib中同樣有個print()
方法,那專案Compile就會連結該Shared Lib中的print()
方法,於是APP啟動也同樣會有print()
方法可使用
1 | CODE (import shared lib) -> Compiled |
Shared Library支援動態連結載入
使用情境
若要給客戶提供一個有100個功能的APP
交付給客戶的若是 Static Library建築出的APP:
1 | 客戶聽著,你只要有這一個檔案,就包含了你需要的100個功能 |
若交付給客戶的功能,每一隻功能都用Shared Library實作,那麼。。。
1 | 客戶聽著,我這個檔案很小,但同時要連結100的檔案 (Shared Library),一個都不能少,才能啟動 |
優缺點
Static | Shared | |
---|---|---|
專案大小 | 專案size比較肥大 | 專案的size較小 |
啟動狀況 | 程式碼在Compile時都放在一起了,直接運行該專案就好 | 若某個Shared Lib不見,專案會無法啟動 |
是否支援動態連結 | 無,專案運作時較耗費記憶體 | 有支援,當執行到有使用Shared Library的class時,才會載入之到記憶體,避免記憶體空間浪費 |
Library編譯的檔案格式
-
Shared Libraries
- .so (Linus)
- .dll (Win)
- .dylib (Mac)
-
Static Libraries
- .a
- .lib
參考
Static vs. Shared Libraries
https://www.youtube.com/watch?v=-vp9cFQCQCo
Static 與 Shared 的函式庫撰寫
https://fred-zone.blogspot.com/2006/03/static-shared.html
動態連結函式庫
https://zh.wikipedia.org/wiki/动态链接库