庫 = 編譯好的可復用二進制代碼。靜態/動態區別在於鏈接階段:

# 1. 編譯目標文件
g++ -c StaticMath.cpp -o StaticMath.o
# 2. 打包為靜態庫 (命名規範: libxxx.a)
ar -crv libstaticmath.a StaticMath.o
# 3. 使用
g++ Test.cpp -L./lib -lstaticmath -o Test
# -L: 庫搜索路徑; -l: 庫名 (去掉 lib 前綴和 .a 後綴)
StaticMath.lib使用方式:屬性頁 → 鏈接器 → 輸入 → 附加依賴項添加 StaticMath.lib,C/C++ → 常規 → 附加包含目錄添加頭文件路徑。

# -fPIC: 生成位置無關代碼 (共享庫必需)
# -shared: 生成動態庫
g++ -fPIC -shared DynamicMath.cpp -o libdynmath.so
# 使用 (編譯同靜態庫)
g++ Test.cpp -L./lib -ldynmath -o Test
# 運行時找不到庫? 解決:
# 1. 複製到 /usr/lib 或 /usr/local/lib
# 2. 或設置 LD_LIBRARY_PATH
# 3. 或編輯 /etc/ld.so.conf + 執行 ldconfig
__declspec(dllexport)DllMain 入口導入庫:動態庫編譯產生的 .lib (極小,只含符號表),鏈接時用;運行時需 .dll。
| 平台 | API | 關鍵函數 |
|---|---|---|
| Linux | <dlfcn.h> | dlopen, dlsym, dlclose, dlerror |
| Windows | Win32 API | LoadLibrary, GetProcAddress, FreeLibrary |
extern "C" 修飾導出函數,禁用修飾 (僅限非成員函數、不可重載)nm libxxx.so:查看符號表 (T=定義文本段, U=未定義, W=弱符號)ldd executable:查看可執行文件依賴的共享庫g++ 選項:-fPIC、-shared、-static、-L、-l、-Wl, 傳遞鏈接器參數| 維度 | 靜態庫 | 動態庫 |
|---|---|---|
| 鏈接時機 | 編譯期 | 運行期 |
| 可執行文件體積 | 大 (含庫代碼) | 小 (僅符號引用) |
| 運行時依賴 | 無 | 需庫文件存在 |
| 內存佔用 (多進程) | 各自副本 | 共享單份 |
| 更新部署 | 重編全量發布 | 替換庫文件增量更新 |
| 適用場景 | 小工具、嵌入式、無依賴部署 | 大型系統、插件架構、頻繁更新模塊 |
避坑指南:DLL Hell (版本衝突) → 使用 Side-by-Side 組件、版本號規範、獨立安裝目錄。