C/C++的动态库几乎可以被所有其它语言正常调用,MATLAB也不例外,这里简单记录一下MATLAB调用C++动态库的做法。

首先,我们简单创建一个动态库,由于我们的实验环境是Windows+MSVC,需要注意动态库的符号导出问题,动态库包括头文件demo.h和源文件demo.cpp

demo.h
1
2
3
4
5
6
7
8
9
10
11
12
13
#pragma once

#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif

extern "C" {
MY_API int add(int a, int b);

MY_API double multiply(double a, double b);
}
demo.cpp
1
2
3
4
5
6
#define MY_EXPORTS
#include "demo.h"

int add(int a, int b) { return a + b; }

double multiply(double a, double b) { return a * b; }

然后在Release模式下编译得到demo.dll,将其和头文件一起放在同一个目录中,使用下面的MATLAB脚本进行测试

test.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 加载dll
loadlibrary('demo.dll','demo.h');
% 判断dll是否加载
libisloaded('demo');

% 查看dll中的函数
libfunctions('demo');
% 调用dll中的函数
calllib('demo', 'multiply', 5.20, 13.14)
calllib('demo', 'add', 5, 13)

% 卸载dll
unloadlibrary('demo')
% 判断dll是否加载
libisloaded('demo')

运行结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13

Functions in library demo:

add multiply


ans =
68.3280
ans =
18
ans =
logical
0

这里的情况比较简单,在更一般的情况下还存在MATLAB数据类型和C++数据类型的转换问题,暂时不作讨论。