動態連結庫(DLL/Dynamic Link Library) 是軟體設計常用技術,可減少程式體積、節省空間、提高效率、增強擴展性與模組化管理。Windows(DLL)與 Linux(Shared Object/.so)雖概念對應,但格式、調用方式、編譯流程迥異。本文系統分析比較兩平台動態庫技術,並給出 VC++ DLL 移植至 Linux 的完整方法與經驗。
.dll/.drv/.fon.lib| 方式 | 別名 | 特點 |
|---|---|---|
| 靜態調用 | 隱式調用 | 編譯系統自動處理載入/卸載,將 .lib 加入專案,原始碼僅需宣告函數 |
| 動態調用 | 顯式調用 | 程式設計師用 API 手動控制:LoadLibrary、GetProcAddress、FreeLibrary,記憶體效率更高,適合大型應用 |
DllMain(初始化/終結).def 模組定義檔 EXPORT 區段、__declspec(dllexport) 修飾符、命令列 /EXPORT.so,靜態庫 .a-shared 選項產生動態庫/lib、/usr/X11R6/lib 存放系統共享物件LD_PRELOAD 環境變數可替換系統模組.h、實作檔 .c/.cpp、Makefile.sodlfcn.h,使用 dlopen/dlsym/dlclose/dlerror,編譯加 -rdynamic -ldllib*.so.*,維護 /etc/ld.so.conf,執行 ldconfig,編譯用 -l/-L 選項ldd 檢查程式相依共享庫| 維度 | Windows (DLL) | Linux (SO) |
|---|---|---|
| 執行檔格式 | PE | ELF |
| 初始化入口 | 需 DllMain | 不需要 |
| 函數匯出宣告 | 需 __declspec(dllexport) | 無需特殊宣告 |
| 編譯環境 | VC++ 圖形化 IDE,少寫 Makefile | gcc 命令列,必須撰寫 Makefile,規則較嚴格 |
| 調用方式 | 顯式/隱式雙支援 | 顯式/隱式雙支援,但 API 不同 |
| 匯出函數檢視 | dumpbin、Depends | nm、ldd |
| 跨平台相容 | 不可跨平台使用 | 不可跨平台使用 |
ext2 區分大小寫,#include 必須與實際檔名大小寫一致windows.h、winsock.h 等,補充 Linux 對應標頭(如 sys/socket.h、netinet/in.h)__int16、__int32、TRUE、SOCKET)需自建標頭檔映射(如 SOCKET → int)BOOL、BYTE、DWORD、__asm 等非標準關鍵字,盡量避免或用 #ifdef 分平台定義closesocket() → close()、檔案操作用 open/fopen 替代 Windows Handle 機制-shared,數學函數連結加 -lmmalloc 或改用變數;結構體傳遞必須用指標/、Windows \本文系統比較 Windows/Linux 動態庫技術差異,總結 VC++ DLL 移植 Linux 的 7 大核心規範與細節陷阱。實際移植中因系統設計差異,遇到的問題遠超文中範例,但掌握這些原則與技巧,將為跨平台開發奠定堅實基礎。