函式庫是預先編譯好的函數集合,遵循可重用原則,封裝常見功能。本質上是可執行代碼的二進制形式,可被作業系統載入記憶體執行。Windows 與 Linux 因核心架構不同,二進制格式不相容。
| 平台 | 靜態庫 | 動態/共享庫 |
|---|---|---|
| Windows | .lib (COFF 格式) | .dll (PE 格式) |
| Linux | .a (ar 打包的 ELF 目標檔) | .so (ELF 共享物件) |
libxxxx.a (如 libpthread.a)libxxxx.so.major.minor (如 libc.so.6),透過 soname 機制管理版本相容。xxxx.lib / xxxx.dll,無強制 lib 前綴。| 維度 | 靜態連結 | 動態連結 |
|---|---|---|
| 代碼載入時機 | 編譯鏈接階段,代碼拷貝進可執行檔 | 執行階段由動態鏈接器 (ld.so) 載入 |
| 可執行檔體積 | 較大 (含所有庫代碼) | 較小 (僅含符號引用) |
| 記憶體佔用 | 每進程獨佔庫代碼副本 | 多進程共享單一記憶體映射 |
| 升級維護 | 需重新編譯部署 | 替換 .so 即可,無需重編應用 |
| 部署相依性 | 無外部相依 | 需目標系統存在相容版本 .so |
DT_NEEDED 動態段記錄,運行時由 ld-linux.so 解析。A.dll 可隱式相依 B.dll,載入 A 時自動載入 B。gcc -lA -lB),符號解析在最終連結階段完成。dlopen() 運行時動態載入,由調用者提供符號解析上下文。.lib (Import Library) 供連結器解析導出符號。__declspec(dllexport) / dllimport 顯式標記。-fvisibility=hidden + __attribute__((visibility("default"))) 控制導出;或使用版本腳本 (ld --version-script)。add_library(mylib SHARED/STATIC)。ldd your_binary 確認所有 DT_NEEDED 可解析;readelf -d your_binary | grep NEEDED 查看聲明相依。Windows DLL 與 Linux .so 雖同屬動態共享庫概念,但在格式 (PE vs ELF)、相依解析機制 (Header vs DT_NEEDED)、隱式相依鏈支援、開發介面 (.lib vs .h) 等核心機制上存在本質差異。理解差異有助於跨平台開發、避免部署時的符號解析失敗與版本衝突。