| 特性 | 靜態庫 (.lib) | 動態庫 (.dll + .lib) |
|---|---|---|
| 鏈接時機 | 編譯期(靜態鏈接) | 運行期(動態鏈接) |
| 代碼副本 | 複製進可執行文件 | 共享單一內存副本 |
| 更新部署 | 需重新編譯主程序 | 僅替換 DLL 文件 |
| 體積 | 增大 EXE | EXE 較小,共享 DLL |
MathFuncsDll,方案名 DynamicLibrary。MathFuncsDll.h
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif
namespace MathFuncs {
class MATHFUNCSDLL_API MyMathFuncs {
public:
static double Add(double a, double b);
static double Subtract(double a, double b);
static double Multiply(double a, double b);
static double Divide(double a, double b); // b==0 拋出 invalid_argument
};
}
MATHFUNCSDLL_EXPORTS 由專案屬性自動定義,確保構建 DLL 時導出,使用者引入頭文件時導入。
MathFuncsDll.cpp
#include "MathFuncsDll.h" #includeusing namespace std; namespace MathFuncs { double MyMathFuncs::Add(double a, double b) { return a + b; } double MyMathFuncs::Subtract(double a, double b) { return a - b; } double MyMathFuncs::Multiply(double a, double b) { return a * b; } double MyMathFuncs::Divide(double a, double b) { if (b == 0) throw invalid_argument("b cannot be zero!"); return a / b; } }
MyExecRefsDll,加入同一方案。..\MathFuncsDll\。// MyExecRefsDll.cpp #include#include "MathFuncsDll.h" using namespace std; int main() { double a = 7.4, b = 99; cout << "a + b = " << MathFuncs::MyMathFuncs::Add(a, b) << endl; cout << "a - b = " << MathFuncs::MyMathFuncs::Subtract(a, b) << endl; cout << "a * b = " << MathFuncs::MyMathFuncs::Multiply(a, b) << endl; cout << "a / b = " << MathFuncs::MyMathFuncs::Divide(a, b) << endl; try { cout << "a / 0 = " << MathFuncs::MyMathFuncs::Divide(a, 0) << endl; } catch (const invalid_argument& e) { cout << "Caught: " << e.what() << endl; } return 0; }
# 建構 DLL cl /LD /EHsc MathFuncsDll.cpp # 建構 EXE cl /EHsc MyExecRefsDll.cpp /link MathFuncsDll.lib
__declspec(dllexport),否則外部不可見。