request-free-img

手把手教你在 Visual Studio 下创建并使用 C++ 动态链接库(DLL)

太多新手 C++ 程序员私信问我要如何创建动态链接库,这个视频我就手把手教你在 VS 下创建并使用动态链接库。

1. 创建动态链接库项目

  1. 打开 Visual Studio
  2. 创建新项目 → 选择 C++
  3. 平台选择 Windows(这里以 Windows 为例)
  4. 项目模板选择:Dynamic-link Library (DLL)
  5. 填写项目名称和保存路径 → 点击「创建」

创建完成后,你会得到一个最简 DLL 项目,默认已经包含了 DllMain 入口函数。

2. 编写导出接口头文件(mydll.h)

VS 已经帮你生成好了头文件,我们在此基础上完善导出宏和函数声明:

#pragma once

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

// 使用 extern "C" 防止 C++ 名称改编(name mangling)
// 非常重要!尤其是给 C 语言或其他语言调用时必须加
extern "C" MYDLL_API double Add(double a, double b);
extern "C" MYDLL_API double Multiply(double a, double b);
extern "C" MYDLL_API double Power(double base, double exp);

关键点解释:

  • #pragma once:头文件防重包含
  • MYDLL_EXPORTS:创建 DLL 项目时,VS 已经自动在「预处理器定义」里添加了这个宏,所以在 DLL 项目中 MYDLL_API 会展开成 __declspec(dllexport)
  • 在使用 DLL 的项目中没有这个宏,所以会展开成 __declspec(dllimport)
  • extern "C":让导出函数名保持原始 C 风格,不被 C++ 编译器改编

3. 实现导出函数(mydll.cpp)

// mydll.cpp
#include "mydll.h"
#include <cmath>

extern "C" MYDLL_API double Add(double a, double b)
{
    return a + b;
}

extern "C" MYDLL_API double Multiply(double a, double b)
{
    return a * b;
}

extern "C" MYDLL_API double Power(double base, double exp)
{
    return std::pow(base, exp);
}

编译生成解决方案 → 在 DebugRelease 目录下会得到:

  • MyDLL.dll:真正的动态链接库,运行时加载
  • MyDLL.lib:导入库(隐式链接时需要)

4. 创建测试程序(控制台应用)

  1. 在同一解决方案中 → 右键解决方案 → 添加 → 新建项目
  2. 选择 Console App(控制台应用程序)
  3. 创建完成

5. 在测试程序中使用 DLL(隐式链接方式)

步骤 1:添加头文件搜索路径

项目属性 → C/C++ → 常规 → 附加包含目录 → 添加 DLL 项目的目录(包含 mydll.h 的路径)

步骤 2:添加库文件搜索路径

项目属性 → 链接器 → 常规 → 附加库目录 → 添加 DLL 生成的 .lib 文件所在目录

步骤 3:添加依赖的 .lib 文件

项目属性 → 链接器 → 输入 → 附加依赖项 → 添加 MyDLL.lib

步骤 4:编写测试代码

#include <iostream>
#include "mydll.h"

int main()
{
    std::cout << "3 + 5 = " << Add(3, 5) << std::endl;
    std::cout << "4 * 7 = " << Multiply(4, 7) << std::endl;
    std::cout << "2^10 = " << Power(2, 10) << std::endl;
    return 0;
}

步骤 5:编译运行

确保 MyDLL.dll 在可执行文件同目录下,或者已放入系统路径,否则运行时会提示找不到 DLL。

6. 发布时需要提供哪些文件?

链接方式 需要提供的文件
隐式链接(C/C++ 最常见) MyDLL.dll + MyDLL.lib + mydll.h
显式链接(LoadLibrary + GetProcAddress) 仅需 MyDLL.dll
给其他语言(如 C#, Python, Delphi 等)使用 强烈建议加 extern "C",只提供 .dll(显式加载)或配合 P/Invoke

总结

现在你已经完整掌握了在 Visual Studio 中:

  • 创建 DLL 项目
  • 正确导出函数(带 extern "C" 和导出宏)
  • 在另一个项目中通过隐式链接使用 DLL

怎么样,现在你学会了吗?赶快动手试试吧~


更多问题探讨,请关注公众号:程序员角