靜態庫(Static Library)將多個目標檔打包成單一 .a 檔案,連結時僅提取所需符號,減少執行檔體積並簡化建置指令。本文以堆疊模組為例,示範從原始碼拆分、編譯、打包到連結的完整步驟。
.
├── main.c
└── stack/
├── stack.c // 全域資料:stack[512], top
├── push.c // push() 實作
├── pop.c // pop() 實作
├── is_empty.c // is_empty() 實作
└── stack.h // 介面宣告
# 編譯各模組產生 .o 檔
gcc -c stack/stack.c stack/push.c stack/pop.c stack/is_empty.c
# 使用 ar 打包並建立索引
ar rs libstack.a stack.o push.o pop.o is_empty.o
# 等同於
ar r libstack.a stack.o push.o pop.o is_empty.o
ranlib libstack.a
r:插入/取代目標檔;s:建立符號索引供連結器快速查找。lib<name>.a。gcc main.c -L. -lstack -Istack -o main
-L. 指定庫搜尋路徑為當前目錄(必要)。-lstack 連結 libstack.a(編譯器優先找 .so,再找 .a)。-Istack 指定標頭檔搜尋路徑。| 特性 | 靜態庫 (.a) | 動態庫 (.so) |
|---|---|---|
| 連結階段 | 將目標檔複製進執行檔 | 僅記錄庫名與路徑 |
| 執行檔大小 | 較大 | 較小 |
| 執行時依賴 | 無 | 需動態連結器載入 |
| 符號解析 | 連結時完成 | 載入時/執行時完成 |
| 未使用函數 | 不會被連結 | 整個庫皆載入 |