靜態與動態函式庫的介紹與差異(Static 與 Shared Libraries)

Posted by Kubeguts on 2020-08-17

剛好在複習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
2
CODE (import static lib) -> Compiled STATIC Lib
APP 啟動 -> PRINT()

Shared Library

顧名思義就是直接共享Library內的程式碼

當專案使用的是Shared Library,那專案進行Compile時,Compiler會去Link Shared Libaray的方法,而不是用複製的。

假如Shared Library Lib中同樣有個print()方法,那專案Compile就會連結該Shared Lib中的print()方法,於是APP啟動也同樣會有print()方法可使用

1
2
CODE (import shared lib) -> Compiled
APP 啟動 -> 連結使用 Shared Lib內的 print()

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/动态链接库