Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Windows 與 Linux 動態函式庫深度解析:DLL 與 SO 移植實戰指南

編輯:Linux 教學

動態連結庫(DLL/Dynamic Link Library) 是軟體設計常用技術,可減少程式體積、節省空間、提高效率、增強擴展性與模組化管理。Windows(DLL)與 Linux(Shared Object/.so)雖概念對應,但格式、調用方式、編譯流程迥異。本文系統分析比較兩平台動態庫技術,並給出 VC++ DLL 移植至 Linux 的完整方法與經驗。

1. Windows 動態庫技術(DLL)

核心特性

  • 執行時載入進程虛擬空間,使用調用進程記憶體與堆疊
  • 單一記憶體實例,多進程共享代碼
  • 可包含資源(字型等),副檔名 .dll/.drv/.fon
  • 靜態庫對應 .lib

兩種調用方式

方式別名特點
靜態調用隱式調用編譯系統自動處理載入/卸載,將 .lib 加入專案,原始碼僅需宣告函數
動態調用顯式調用程式設計師用 API 手動控制:LoadLibrary、GetProcAddress、FreeLibrary,記憶體效率更高,適合大型應用

建立與匯出函數

  • VC++ 可建立純 C 或 MFC 架構 DLL,入口點預設 DllMain(初始化/終結)
  • 匯出函數三法:.def 模組定義檔 EXPORT 區段、__declspec(dllexport) 修飾符、命令列 /EXPORT

2. Linux 共享物件技術

核心特性

  • 對應檔案 .so,靜態庫 .a
  • 編譯加 -shared 選項產生動態庫
  • 標準目錄 /lib、/usr/X11R6/lib 存放系統共享物件
  • LD_PRELOAD 環境變數可替換系統模組

開發流程

  1. 撰寫介面檔 .h、實作檔 .c/.cpp、Makefile
  2. 編譯產生 .so
  3. 調用方式二擇一:
    • 顯式調用:包含 dlfcn.h,使用 dlopen/dlsym/dlclose/dlerror,編譯加 -rdynamic -ldl
    • 隱式調用:命名 lib*.so.*,維護 /etc/ld.so.conf,執行 ldconfig,編譯用 -l/-L 選項
  4. ldd 檢查程式相依共享庫

3. 兩平台深度比較

維度Windows (DLL)Linux (SO)
執行檔格式PEELF
初始化入口需 DllMain不需要
函數匯出宣告需 __declspec(dllexport)無需特殊宣告
編譯環境VC++ 圖形化 IDE,少寫 Makefilegcc 命令列,必須撰寫 Makefile,規則較嚴格
調用方式顯式/隱式雙支援顯式/隱式雙支援,但 API 不同
匯出函數檢視dumpbin、Dependsnm、ldd
跨平台相容不可跨平台使用不可跨平台使用

4. VC++ DLL 移植至 Linux 實戰規範

  1. 標頭檔順序與大小寫:保持原順序;Linux ext2 區分大小寫,#include 必須與實際檔名大小寫一致
  2. 平台專屬標頭檔:註解 windows.h、winsock.h 等,補充 Linux 對應標頭(如 sys/socket.h、netinet/in.h)
  3. 資料型別對應:VC++ 專有型別(__int16、__int32、TRUE、SOCKET)需自建標頭檔映射(如 SOCKET → int)
  4. 關鍵字處理:BOOL、BYTE、DWORD、__asm 等非標準關鍵字,盡量避免或用 #ifdef 分平台定義
  5. 系統呼叫函數修改:closesocket() → close()、檔案操作用 open/fopen 替代 Windows Handle 機制
  6. Makefile 撰寫:參考 VC++ 產生的 Makefile,編譯動態庫加 -shared,數學函數連結加 -lm
  7. 其他關鍵點:
    • 程式結構分析(界面邏輯通常不在 DLL 中,較易移植)
    • 檔案權限:Linux 分擁有者/群組/其他,寫入操作需確保權限
    • 指標嚴格性:定義指標僅配置 4 bytes,賦值前必須 malloc 或改用變數;結構體傳遞必須用指標
    • 路徑分隔符:Linux /、Windows \

結語

本文系統比較 Windows/Linux 動態庫技術差異,總結 VC++ DLL 移植 Linux 的 7 大核心規範與細節陷阱。實際移植中因系統設計差異,遇到的問題遠超文中範例,但掌握這些原則與技巧,將為跨平台開發奠定堅實基礎。

Copyright © Windows教程網 All Rights Reserved