首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 連結動態連結庫 (DLL) 五種方法完整比較

     編輯:VC 教學

前言

VC++ 專案使用 DLL 有靜態連結(隱式)與動態載入(顯式)兩大類,共五種常見做法。本文比較各方法操作步驟、優缺點與適用場景。

方法一:顯式動態載入 — LoadLibrary / GetProcAddress


// 執行期載入
HINSTANCE hDll = LoadLibrary(_T("MyLib.dll"));
if (hDll) {
    typedef void (*PFUNC)();
    PFUNC pFunc = (PFUNC)GetProcAddress(hDll, "MyFunction");
    if (pFunc) pFunc();
    FreeLibrary(hDll);
}
  • **優點**:完全控制載入時機、可延遲載入、支援插件架構、無需 .lib 檔。
  • **缺點**:程式碼繁瑣、需手動處理函式指標轉型、易出錯、無編譯期型別檢查。

方法二:專案相依性 — Project Dependencies

  1. 方案總管右鍵方案 → Project Dependencies。
  2. 勾選 DLL 專案,建置順序自動調整。
  • **優點**:IDE 自動複製輸出 DLL 至執行目錄、管理建置順序。
  • **缺點**:需擁有 DLL 專案原始碼、僅適用同方案內專案。

方法三:直接加入 .lib 檔到專案

方案總管 → 專案右鍵 → Add → Existing Item → 選擇 MyLib.lib。

  • **優點**:簡單直觀,建置時自動連結。
  • **缺點**:.lib 路徑若變動需手動更新;不支援條件編譯(Debug/Release 不同 .lib)。

方法四:連結器設定 — Additional Dependencies / Library Directories

  1. Project → Properties → Linker → General → Additional Library Directories 加入 .lib 目錄。
  2. Linker → Input → Additional Dependencies 加入 MyLib.lib。
  • **優點**:標準做法,支援巨集區分 $(Configuration)、$(Platform),適合團隊專案。
  • **缺點**:設定較繁瑣,新手易遺漏。

方法五:原始碼 #pragma comment(lib, ...)


// StdAfx.h 或任意通用標頭
#pragma comment(lib, "MyLib.lib")
  • **優點**:零專案設定,原始碼自述連結需求,跨專案複製即用。
  • **缺點**:路徑仍需在 Additional Library Directories 設定;不支援條件編譯(可配合 #ifdef _DEBUG 區分)。

比較總結表

方法類型需 .lib需 DLL 專案載入時機推薦場景
LoadLibrary顯式否否執行期插件、選用模組、無原始碼 DLL
Project Dependencies隱式是是啟動時同方案內 DLL 專案
Add .lib to Project隱式是否啟動時快速原型、單一專案
Linker Settings隱式是否啟動時**標準團隊專案**
#pragma comment隱式是否啟動時函式庫發布、跨專案共用

隱式連結必要檔案清單

  • MyLib.h — 宣告 __declspec(dllimport) 函式/類別。
  • MyLib.lib — 匯入庫,連結時解析符號。
  • MyLib.dll — 執行期必須在 PATH 或應用程式目錄。

常見錯誤與解決

  • LNK2001 未解析的外部符號:.lib 未加入連結器輸入、或 .h 缺少 __declspec(dllimport)。
  • 執行期「找不到 DLL」:DLL 未放在輸出目錄、系統目錄或 PATH 目錄;用 Dependency Walker 診斷。
  • 呼叫慣例不符:DLL 導出 __stdcall,呼叫端預設 __cdecl;.h 需統一標註 CALLBACK 或 WINAPI。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved