Static libraries :
Static 程式庫用於靜態連結,把一堆 object 檔,用 ar (archiver) 包裝集合起來,檔名以 `.a' 結尾。
優點:執行效能快,且因靜態連結,不易發生執行時找不到 library 或版本問題。
缺點:檔案較大,維護度較低
Shared libraries :
Shared library 程式執行起始時載入,而不是執行中用到才載入。連結階段需要有該程式庫才能進行連結。
優點:維護彈性較好。
soname:library 的名稱,例: libmylib.so.1
real name:實際放有library程式的檔案名稱,例:libmylib.so.1.0.0
linker name:連結時的名稱,通常是不含版號,例: libmylib.so
使用範例:
* Complie :
# gcc -c -fPIC LibData1.c LibData2.c
-fPIC 產生 position-independent code。也可以用 -fpic 參數。
# gcc -shared -Wl,-soname,libmylib.so.1 LibData1.o LibData2.o -o libmylib.so.1.0.0
-shared 表示要編譯成 shared library
-Wl 用於參遞參數給linker,-soname與libmylib.so.1會被傳給linker處理。-soname 用來指名 soname 為 limylib.so.1
library 會被輸出成 libmylib.so.1.0.0(real name), 若不指定 soname 的話,在編譯結連後的執行檔會以連時的library檔名為 soname,並載入他。否則是載入 soname 指定的 library 檔案。
* 用 ln 來建立 soname 與 linker name 兩個檔案 :
# ln -s libmylib.so.1.0.0 libmylib.so.1 <- 連結soname
# ln -s libmylib.so.1.0.0 libmylib.so <- 連結函式庫名稱
* 使用方法 : 與 static library 同 :
gcc main.c libmylib.so.1.0.0
or
gcc main.c -L. -lmylib #-lmylib ->libmylib.so,透過上面ln取得libmylib.so.1.0.0
如果目錄下同時有 static 與 shared library 的話,會以 shared 為主,可以使用 -static 參數可以避免使用shared連結。
版本號:
第1碼:原介面有移除或改變,與舊版不相容時。
第2碼:有新增加介面,但相舊介面沒改變,所以與舊版本相容。
第3碼:用於程式內容的修正,介面完全沒有改變。
Dynamically loaded libraries :
像 windows 所用的 DLL ,在使用到時才載入,編譯連結時不需要相關的 library。動態載入庫常被用於像 plug-ins 的應用.
動態載入是透過一套 dl function來處理,預設 API如下 :
#include <dlfcn.h>
void *handle = dlopen(const char *filename, int flag); // 根據檔名開啟library並回傳handle
void (*func)(void); // 宣告function
func = dlsym(void *handle, const char *symbol); // 根據symbol,取得function記憶體位置
int dlclose(void *handle); // 關閉library
char *dlerror(void); // 傳回最近所發生的錯誤訊息。
使用方法:與Shared Library同,只差別在使用程式碼,如上。
Ref:
[Linux 教學] 用gcc 自製 Library
Program Library HOWTO
Linux 的動態連結與載入 (Dynamic Linking)