.h/.cpp,編譯產生 Debug/MyLib.lib。extern "C" 強制 C 連結慣例,避免 C++ Name Mangling。.lib、.h 至客戶專案。MyLib.lib (或相對路徑)。#include "MyLib.h" 直接呼叫。.dll、.lib (導入庫)。// 方法 1: __declspec(dllexport) (推薦)
__declspec(dllexport) int Add(int a, int b);
// 方法 2: .def 檔 (Resource Files 新增 .def)
LIBRARY "MyDll"
EXPORTS
Add
Subtract @2
.dll、.lib、.h 到專案。.lib。#include "MyDll.h" 直接呼叫,載入器自動載入 DLL。無需 .lib,運行時決定載入。
typedef void (*PFN_FUNC)();
HMODULE hDll = LoadLibrary(_T("MyDll.dll"));
if (hDll) {
PFN_FUNC pfn = (PFN_FUNC)GetProcAddress(hDll, "MyFunc");
if (pfn) pfn();
FreeLibrary(hDll);
}
| 特性 | 靜態庫 | 動態庫 (隱式) | 動態庫 (顯式) |
|---|---|---|---|
| 檔案 | .lib | .dll + .lib | .dll |
| 程式碼複製 | 連結時複製進 EXE | 運行時共享記憶體 | 運行時手動載入 |
| 更新部署 | 需重新編譯 EXE | 替換 DLL 即可 | 替換 DLL 即可 |
| 相依性 | 無 | 需目標機有 DLL | 需目標機有 DLL |
| 匯出 C++ 類別 | 支援 | 支援 (版本鎖定) | 極難 (需手動 GetProcAddress 裸函數指標) |
Debug/MyLib.lib 不能給 Release 專案用,CRT 版本不符會崩潰。/MT、/MTd、/MD、/MDd 其中之一。