動態庫(Shared Library)是 Unix/Linux 系統上程式碼複用、模組化部署的核心機制。《精通 Unix 下 C 語言程式設計與專案實踐》詳細記錄了主流 Unix 平台建立動態庫的具體命令與差異。本文整理為速查手冊,並附帶完整實戰範例。
.o.so(或 HP-UX 的 .sl)關鍵編譯選項:-fpic/-KPIC(PIC)、-shared/-G(鏈接),不同平台編譯器參數不同。
兩個同名函數/變數的來源檔,驗證動態載入時的符號隔離:
// d1.c
int p = 2;
void print() { printf("This is the first dll src!\n"); }
// d2.c
int p = 3;
void print() { printf("This is the second dll src!\n"); }
# 分步驟
cc -O -KPIC -c d1.c d2.c
cc -G -o d1.so d1.o
cc -G -o d2.so d2.o
# 一步到位
cc -O -KPIC -G -o d1.so d1.c
cc -O -KPIC -G -o d2.so d2.c
cc +z -c d1.c d2.c
ld -b -o d1.so d1.o
ld -b -o d2.so d2.o
# 注意:HP-UX 預設擴展名為 .sl
xlc_r4 -c d1.c d2.c
ld -G -bnoentry -bexpall -lc d1.o -o d1.so
ld -G -bnoentry -bexpall -lc d2.o -o d2.so
# 分步驟
gcc -fpic -c d1.c d2.c
gcc -shared -o d1.so d1.o
gcc -shared -o d2.so d2.o
# 一步到位
gcc -O -fpic -shared -o d1.so d1.c
gcc -O -fpic -shared -o d2.so d2.c
# 部分 GCC 版本支援 -G 替代 -shared
| 平台 | 編譯器 | PIC 選項 | 鏈接選項 | 輸出擴展名 |
|---|---|---|---|---|
| Solaris/SCO | cc | -KPIC | -G | .so |
| HP-UX | cc/ld | +z | ld -b | .sl |
| AIX | xlc/ld | 預設 | ld -G -bnoentry -bexpall | .so |
| Linux | gcc | -fpic | -shared | .so |
-bexpall)影響動態載入行為LD_LIBRARY_PATH 或 /etc/ld.so.conf 設定搜尋路徑掌握跨平台動態庫建置,是 Unix 系統程式開發者的必修課,亦是構建高可維護、可擴充系統的基石。