导航

Matlab生成dll并在Qt中调用Matlab生成dllQt调用生成的dlldll库输入输出参数使用时的心得参考链接

Matlab生成dll并在Qt中调用

手动将Matlab算法转成C++费时费力,同时matlab coder生成的C/C++代码非常复杂,为了提高开发效率,可以使用Matlab生成动态库dll,然后在Qt中调用。

Matlab生成dll

首先确定要转换的.m文件是一个有输入输出的完整函数,所有依赖的第三方库函数最好都放到这个文件中,使用一个main.m文件调用这个函数可以顺利运行,大致结构如下

function [outA, outB] = calcOne(a, b,c)

%主函数体 .m文件同名函数

end

function [x] = ls(aa, bb)

% 用到的其他函数

end

配置mingw编译器,去matlab官方网站查找对应的mingw版本,链接: matlab版本对应的mingw版本mingw下载链接 或者早期版本matlab对应的mingw链接安装mingw到自己知道的目录中(目录中最好不要有空格和中文),然后配置系统环境变量,将MinGW-w64中“bin”文件夹所在的位置添加到系统环境变量的路径即可,参考步骤将mingw的路径添加到matlab的环境变量中,matlab命令行输入

setenv(‘MW_MINGW64_LOC’,‘C:\TDM-GCC-64’) % 路径按自己的改

mex -setup C++

显示如下表示成功

在matlab命令行中输入deploytool命令,选择Library Compiler选项 选择C++ Shared Library,点击右侧加号按钮,选中需要生成dll库的源文件,最后点击Package选项生成dll文件 在生成的文件目录中,转到for_redistribution_files_only目录,可以看到生成的dll文件,拷贝*.dll、.h,.lib文件到qt工程目录下。 至此,dll库制作完成

Qt调用生成的dll

在Qt的pro文件最后配置matlab的相关库函数

INCLUDEPATH += 'F:/Program Files/MATLAB/R2021b/extern/include'

INCLUDEPATH += 'F:/Program Files/MATLAB/R2021b/extern/include/win64'

win32: LIBS += -L'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64/' -llibmex

win32: LIBS += -L'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64/' -llibmx

win32: LIBS += -L'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64/' -llibmat

win32: LIBS += -L'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64/' -llibeng

win32: LIBS += -L'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64/' -lmclmcr

win32: LIBS += -L'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64/' -lmclmcrrt

INCLUDEPATH += 'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64'

DEPENDPATH += 'F:/Program Files/MATLAB/R2021b/extern/lib/win64/mingw64'

INCLUDEPATH += 'F:/Program Files/MATLAB/R2021b/extern/lib/win64'

DEPENDPATH += 'F:/Program Files/MATLAB/R2021b/extern/lib/win64'

INCLUDEPATH += 'F:/Program Files/MATLAB/R2021b/extern/lib/win64/microsoft'

DEPENDPATH += 'F:/Program Files/MATLAB/R2021b/extern/lib/win64/microsoft'

***F:/Program Files/MATLAB/R2021b/***

换成自己的Matlab路径

添加.h头文件,将动态库的.h文件添加到项目中添加动态库,将动态库文件添加到项目中,项目文件夹-添加库-外部库-点击库文件选择,取消无用平台勾选,取消windows-为debug版本添加‘d’作为后缀,点击下一步添加初始化调用的dll库,在需要调用这个外部库的文件中添加.h头文件,在这个类的构造函数中添加上这样的语句

// 这个calcOne是库函数的名字,按需求改

if(calcOneInitialize()) {

qDebug() << "calcOne init successfully!";

} else {

qDebug() << "calcOne init failed!";

}

设置函数的输入输出参数,详见第三节输入输出参数设置传参到函数中,可以根据动态库的.h文件查看函数定义,然后在需要的地方传参调用

int nargout = 2;// 输出参数的数量

calcOne(nargout, outA, outB, a, b);// 传出参数的数量,输出参数,输入参数

dll库输入输出参数

其实前边的内容很多人分享过,但是具体怎么传参调用函数 ,我见到的不多,也因此走了许多弯路,现在把我用到的一些参数的设置记录一下。

首先要说明的是matlab生成的dll库函数在传参时需要指定matlab的特定变量类型,C++中一般用mwArray,这就是C++和matlab之间的桥梁,是数组形式,即使只是一个double变量,也要指定为一个1*1的mwArray。

下面按类别说明不同的数据如何初始化并赋值。

单个int、double等

mwArray a(1,1, mxDOUBLE_CLASS,mxREAL);//声明为1*1的矩阵,变量类型为double, 数据类型为real实数

double* aValue = new double[1];// 用来赋值的变量,必须指定为这种一维数组

aValue[0] = 3.0;// 为这个变量赋值

a.SetData(aValue, 1);//为mwArray赋值, 第二个参数是要传递的数据的长度

二维数组

mwArray b(2,3, mxDOUBLE_CLASS,mxREAL);//声明为2*3的矩阵,变量类型为double, 数据类型为real实数

double* bValue = new double[6];// 用来赋值的变量,必须指定为这种一维数组,长度为矩阵的元素的数量,即2*3=6

for (int i = 0; i < 6; i ++) bValue[i] = i;

b.SetData(bValue, 6);//为mwArray赋值, 第二个参数是要传递的数据的长度

这里有个要注意的点,在SetData时,是按照纵向的顺序,一列一列赋值的 所以有这样两种思路:

bValue在设置时,就要提前排列一下顺序,使得b设置之后的结果是理想的结果先使b转置为3*2,SetData,然后在matlab的函数中,使用这个变量之前进行转置

不论使用哪种方法,都最好在matlab函数中加上disp(b),会在Qt的输出中显示这个结果,检查传参是正确。我认为传参是最难最容易出错的部分,不管传什么参数都检查一遍 三维数组没用过,自行探索吧 3. 传递cell矩阵

mwArray cellArray(1, 3, mxCELL_CLASS);// 声明

// 每个元素是一个cell

for (int col = 1; col <= 3; col ++) {

// 每个cell是个2*1的矩阵

mwArray ccc(2, 1, mxDOUBLE_CLASS, mxREAL);

double* data = new double[2 * 1];

for (int xxx = 0; xxx < 2; xxx ++ ) {

data[xxx] = 2;

}

ccc.SetData(data, 2);

cellArray.SetData(col) = ccc;// 在指定位置赋值

}

传出参数

mwArray cellArray(mxDOUBLE_CLASS, mxREAL);// 传出参数可以只声明变量类型,不指定维度

使用时的心得

这个整体做起来还是费了几天功夫,配置mingw比较费时,调用库函数出错调试也很费时间,因此有以下几个建议先使用最简单的matlab函数做测试,在一个demo项目中测试一下这个流程,看能否输出预期结果先设置最简单的一组输入参数,调用函数,在转换的matlab函数开始,先disp(a)一下,看看传递的参数是否正确,以及计算结果是否正确在主项目文件中调用这个库

参考链接

MATLAB MinGW-w64安装与使用 qt调用matlab生成的dll库 QTCreater调用MatLab生成的.dll文件

好文链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。