| 類型 | 後綴 | 鏈接時機 | 運行依賴 | 體積特徵 |
|---|---|---|---|---|
| 靜態庫 | .a | 編譯鏈接期 | 無 | 可執行文件大 |
| 共享庫 | .so.x.y | 程序啟動時載入 | 需庫文件存在 | 可執行文件小 |
| 動態庫 | .so | 首次調用符號時載入 | 需庫文件存在 | 可釋放內存 |
lib.a/.so -l 自動匹配 lib-L 指定目錄 → LD_LIBRARY_PATH → /etc/ld.so.conf → /usr/lib、/libldconfiglibhello.a# hello.h
void print_hello(void);
# hello.c
#include <stdio.h>
void print_hello(void) { puts("Hello from static lib"); }
# 編譯
gcc -c hello.c -o hello.o
ar rcs libhello.a hello.o
# 使用
gcc -o use_static usehello.c -L. -lhello # 或直接 gcc usehello.c libhello.a
libhello.so.0.0# 編譯位置無關代碼
gcc -fPIC -c hello.c -o hello.o
gcc -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0 hello.o
# 建立軟鏈接(供鏈接器與運行期查找)
ln -sf libhello.so.0.0 libhello.so.0
ln -sf libhello.so.0 libhello.so
# 使用
gcc -o use_dynamic usehello.c -L. -lhello
LD_LIBRARY_PATH=. ./use_dynamic # 臨時指定運行路徑
默認優先鏈接共享庫。強制用靜態庫:gcc -o test test.c -Wl,-Bstatic -lhello -Wl,-Bdynamic 或直接指定 libhello.a 路徑。
ldd:查看可執行文件依賴的共享庫nm / objdump:查看符號表ar:靜態庫打包/解包