资料
生成
- 打开 VS,新建项目
calc
,选择 C++动态链接库
- 此时资源方案解决管理器中会有
framework.h
, pch.h
, dllmain.cpp
以及pch.cpp
四个文件。这四个文件自始至终都不用改动。
- 在源文件中新增文件
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; }
|
- 在头文件中新增文件
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
|
- 生成—生成解决方案,得到
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; }
|
隐式调用
- 新建 C++空项目,将
calc.lib
,calc.dll
,calc.h
三个文件拷贝到解决方案文件夹内。注意.dll 与.lib 是配套的,文件名不可更改,.h 文件名可以更改
- 配置项目属性
1 2 3 4
| 调试-环境:PATH=%PATH%;$(SolutionDir); C/C++-常规-附加包含目录:$(SolutionDir); 链接器-常规-附加库目录:$(SolutionDir); 链接器-常规-输入:calc.lib;
|
- 调用函数
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; }
|
- 输出展示

在 Matlab 中调用
- 新建
Main_1.m
文件,内容如下
- 将
calc.dll
,calc.h
两个文件拷贝到Main_1.m
文件所在目录
- 运行
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
|