Matlab中调用dll库函数的方法
1. 准备环境
第1步:从网上下载好mingw-64: 第2步:添加到环境变量中; 第3步:在Matlab中的命令行输入mex -setup检查是否提示找到编译器 第4步:如果还是提示找不到,命令行输入并执行 setenv('MW_MINGW64_LOC','D:\mingw64')。注意:执行时,需要把'D:\mingw64'替换成自己的路径。
2. 自定义C/C++函数并在Matlab中导入dll库
在下面示例中,通过VS定义了几个函数,将工程编译成dll之后,把dll文件和源文件的头文件放到Matlab的工作目录中。
2.1 定义C/C++函数
/*Test.c ——这里是.c还是.cpp应该没有影响,好像cpp中的类还有一些c中没有的特性matlab是不支持的*/
#include "stdlib.h"
#include "stdio.h"
#include "Test.h"
int c;
struct myStruct sc;
float array[] = {10,12,13};
int myadd(int a,int b)//有传参和返回值,且为常见数据类型的函数
{
c = a + b;
return c;
}
int GetC()//无传参,有返回值,且为常见数据类型的函数
{
return c;
}
void dealStruct()//无传参和返回值
{
sc.age = 10;
sc.name = 20;
}
void changeStruct(struct myStruct* sc)
{
sc->age = -1;
sc->name = -1;
}
struct myStruct* GetMyStruct()//无传参有返回值,返回值为自定义结构体类型
{
return ≻
}
float* GetArray()//无传参有返回值,返回值为指针类型
{
return array;
}
/*Test.h*/
#ifndef _TEST_H_
#define _TEST_H_
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport)
struct myStruct {
int name;
int age;
};
__declspec(dllexport)
void dealStruct();
__declspec(dllexport)
void changeStruct(struct myStruct* sc);
__declspec(dllexport)
int myadd(int a, int b);
__declspec(dllexport)
int GetC();
__declspec(dllexport)
struct myStruct* GetMyStruct();
__declspec(dllexport)
float* GetArray();
#ifdef __cpluscplus
}
#endif // _cpluscplus
#endif
2.2 导入dll库并调用库函数
在Matlab中调用以下命令导入Test.dll
clc;clear;close all;
loadlibrary('Test.dll','Test.h');%加载dll库和头文件
libfunctions Test -full;%显示dll库中所有的可执行函数
2.2.1 函数传参和返回值为常用数据类型:
这里调用int myadd(int a, int b)函数
calllib('Test','myadd',8,3)
计算结果:ans = 11,证明调用了函数对输入的形参进行求和计算
2.2.2 函数无传参,返回值为常用数据类型:
这里调用int GetC() 函数
calllib('Test','GeTC')
计算结果:ans = 11,证明获取到c变量的值为11
2.2.3 函数对自定义结构体操作,函数返回结构体指针
这里调用void dealStruct() 函数和struct myStruct* GetMyStruct() 函数
calllib('Test','dealStruct');%给结构体成员赋值
ans = calllib('Test','GetMyStruct')%获取结构体成员的值
ans.Value%显示结构体的值
计算结果:ans = 包含以下字段的 struct: name: 20 age: 10
2.2.4 函数传参为自定义结构体指针:
这里调用struct myStruct* GetMyStruct() 函数和void changeStruct(struct myStruct* sc) 函数
mysc = calllib('Test','GetMyStruct');%获取指向内部结构体sc的结构体指针
mysc.Value %显示结构体所有成员
calllib('Test','changeStruct',mysc);%传入结构体指针,修改结构体成员的值
mysc.Value %显示结构体所有成员
第一次计算结果:ans = 包含以下字段的 struct: name: 20 age: 10
第二次计算结果:ans = 包含以下字段的 struct: name: -1 age: -1
2.2.5 函数返回值为数组指针:
这里调用float* GetArray() 函数
ptr = calllib('Test','GetArray');%用ptr接收函数返回的float*类型的指针
%此时,因为只传递了指针的地址,所以只有在定义了这个指针的类型和大小后,才能获取指针所指向的内容。
setdatatype(ptr,'singlePtr',3,1);%大小为3行1列或者定义成1行3列都可以,singlePtr为指针类型
ptr.Value%显示指针指向数组的内容
ans = 3×1 single 列向量 10 12 13
3. Matlab与C/C++对应数据类型
4. 参考链接
MATLAB如何使用动态链接库的形式调用C++matlab调用dll文件Matlab(.exe)调用C/C++生成的(.dll)Matlab调用Dll,对于自定义结构体数组如何传参?