资料

生成

  1. 打开 VS,新建项目calc,选择 C++动态链接库
  2. 此时资源方案解决管理器中会有framework.h, pch.h, dllmain.cpp以及pch.cpp四个文件。这四个文件自始至终都不用改动。
  3. 在源文件中新增文件calc.cpp,写入下面内容
1
2
3
4
5
6
7
8
9
10
#include "pch.h"
#include "calc.h"

double Add(double a, double b) {
return a + b;
}

double Mis(double a, double b) {
return a - b;
}
  1. 在头文件中新增文件calc.h,写入下面内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once

#ifdef __cplusplus
extern "C" {
#endif

#ifdef XDDERDLL_EXPORTS
#define XDDERDLL_API __declspec(dllexport)
#else
#define XDDERDLL_API __declspec(dllimport)
#endif

// 声明函数
XDDERDLL_API double Add(double a, double b);
XDDERDLL_API double Mis(double a, double b);

#ifdef __cplusplus
}
#endif
  1. 生成—生成解决方案,得到calc.lib, calc.dll文件,第 4 步还有calc.h文件

在 VS 里面调用 DLL

显示调用

不需要加载头文件和 lib 库, https://zhuanlan.zhihu.com/p/374762398

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <windows.h>

typedef double(*anyName)(double, double);
using namespace std;

int main() {
HMODULE mydll = LoadLibrary(TEXT("D:\\Desktop\\Dll1\\x64\\Release\\calc.dll"));
anyName funName = (anyName)GetProcAddress(mydll, "Add");

double x = 1, y = 10.5;
double z = funName(x, y);
cout << z << endl;

FreeLibrary(mydll);

return 0;
}

隐式调用

  1. 新建 C++空项目,将calc.libcalc.dllcalc.h三个文件拷贝到解决方案文件夹内。注意.dll 与.lib 是配套的,文件名不可更改,.h 文件名可以更改
  2. 配置项目属性
1
2
3
4
调试-环境:PATH=%PATH%;$(SolutionDir);
C/C++-常规-附加包含目录:$(SolutionDir);
链接器-常规-附加库目录:$(SolutionDir);
链接器-常规-输入:calc.lib;
  1. 调用函数
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include "calc.h"

int main() {
double a = 1.0;
double b = 2.5;
double c = Add(a, b);
double d = Mis(a, b);
std::cout << c << "\n" << d << std::endl;
return 0;
}
  1. 输出展示

在 Matlab 中调用

  1. 新建Main_1.m文件,内容如下
  2. calc.dllcalc.h两个文件拷贝到Main_1.m文件所在目录
  3. 运行Main_1.m文件
1
2
3
4
5
6
7
8
9
10
11
clc;clear

if libisloaded('calc') %% 确定是否已加载库
unloadlibrary('calc') %% 卸载库
end
loadlibrary('calc.dll', 'calc.h'); %% 加载库
libfunctions('calc') %% 列出库中函数的信息

A = calllib('calc', 'Add', 5.0,3.1);
disp(A)

其它问题

查看 lib/dll 内的函数

检查 lib 或者 dll 中是否确实含有函数

开始菜单 — Developer Command Prompt for VS 2019

1
2
3
cd *******
dumpbin /linkermember calc.lib > A1.txt
dumpbin /exports calc.dll > A2.txt

会输出

1
2
1    0 00001000 Add = Add
2 1 00001010 Mis = Mis