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

C++ 動態鏈接庫 (DLL) 創建與使用完整教程:Visual Studio 實戰

     編輯:關於C++

DLL 與靜態庫的區別

特性靜態庫 (.lib)動態庫 (.dll + .lib)
鏈接時機編譯期(靜態鏈接)運行期(動態鏈接)
代碼副本複製進可執行文件共享單一內存副本
更新部署需重新編譯主程序僅替換 DLL 文件
體積增大 EXEEXE 較小,共享 DLL

步驟一:創建 DLL 專案

  1. VS 選單:文件 → 新建 → 項目 → Visual C++ → Win32 → Win32 控制台應用程序,名稱 MathFuncsDll,方案名 DynamicLibrary。
  2. 精靈:應用程序類型 → DLL,完成。

步驟二:編寫導出類

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"
#include 
using 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;
    }
}

步驟三:創建使用者專案並引用 DLL

  1. 新建 Win32 控制台應用程序,名稱 MyExecRefsDll,加入同一方案。
  2. 專案右鍵 → 引用 → 添加新引用 → 專案 → 勾選 MathFuncsDll。
  3. 屬性頁 → C/C++ → 常規 → 附加包含目錄 加入 ..\MathFuncsDll\。

步驟四:調用 DLL 導出函數

// 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

常見坑點

  • DLL 導出類/函數必須加 __declspec(dllexport),否則外部不可見。
  • DLL 與 EXE 需使用相同運行庫(MD/MT),否則 new/delete 跨邊界會崩潰。
  • DLL 內部拋出的 C++ 異常跨越 DLL 邊界捕獲需確保相同編譯器版本與 RTL。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved