Matlab中调用dll库函数的方法

分类: 365网址经常打不开 时间: 2025-11-10 04:44:18 作者: admin 阅读: 361
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,对于自定义结构体数组如何传参?

相关推荐