MATLAB生成dll库并在Qt中调用及参数设置

Matlab生成dll并在Qt中调用

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

Matlab生成dll

  1. 首先确定要转换的.m文件是一个有输入输出的完整函数,所有依赖的第三方库函数最好都放到这个文件中,使用一个main.m文件调用这个函数可以顺利运行,大致结构如下
function [outA, outB] = calcOne(a, b,c)
%主函数体 .m文件同名函数
end

function [x] = ls(aa, bb)
% 用到的其他函数
end
  1. 配置mingw编译器,去matlab官方网站查找对应的mingw版本,链接: matlab版本对应的mingw版本
  2. mingw下载链接 或者早期版本matlab对应的mingw链接
  3. 安装mingw到自己知道的目录中(目录中最好不要有空格和中文),然后配置系统环境变量,将MinGW-w64中“bin”文件夹所在的位置添加到系统环境变量的路径即可,参考步骤
  4. 将mingw的路径添加到matlab的环境变量中,matlab命令行输入
setenv(‘MW_MINGW64_LOC’,‘C:\TDM-GCC-64)  % 路径按自己的改
mex -setup C++

显示如下表示成功
结果

  1. 在matlab命令行中输入deploytool命令,选择Library Compiler选项
    MATLAB Complier

  2. 选择C++ Shared Library,点击右侧加号按钮,选中需要生成dll库的源文件,最后点击Package选项生成dll文件
    生成dll

  3. 在生成的文件目录中,转到for_redistribution_files_only目录,可以看到生成的dll文件,拷贝*.dll、.h,.lib文件到qt工程目录下。

  4. 至此,dll库制作完成

Qt调用生成的dll

  1. 在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路径
  1. 添加.h头文件,将动态库的.h文件添加到项目中
  2. 添加动态库,将动态库文件添加到项目中,项目文件夹-添加库-外部库-点击库文件选择,取消无用平台勾选,取消windows-为debug版本添加‘d’作为后缀,点击下一步添加
  3. 初始化调用的dll库,在需要调用这个外部库的文件中添加.h头文件,在这个类的构造函数中添加上这样的语句
// 这个calcOne是库函数的名字,按需求改
if(calcOneInitialize()) {
	qDebug() << "calcOne init successfully!";
} else {
	qDebug() << "calcOne init failed!";
}
  1. 设置函数的输入输出参数,详见第三节输入输出参数设置
  2. 传参到函数中,可以根据动态库的.h文件查看函数定义,然后在需要的地方传参调用
int nargout = 2;// 输出参数的数量
calcOne(nargout, outA, outB, a, b);// 传出参数的数量,输出参数,输入参数

dll库输入输出参数

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

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

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

  1. 单个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赋值, 第二个参数是要传递的数据的长度

  1. 二维数组
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;// 在指定位置赋值
}
  1. 传出参数
mwArray cellArray(mxDOUBLE_CLASS, mxREAL);// 传出参数可以只声明变量类型,不指定维度

使用时的心得

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

参考链接

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Qt是一个跨平台的开发框架,而Matlab是一种数学和工程计算软件。要将Matlab打包到Qt,需要进行一些步骤。 首先,确保Matlab已经编译成功并生成了相关的动态链接文件(.dll文件)或者静态链接文件(.lib文件)。 然后,在Qt的项目创建一个新的文件夹,用于存放Matlab的相关文件。 将Matlab的头文件(.h文件)复制到该文件夹。这些头文件包含了需要调用的函数和类的声明。 然后,将生成的动态链接文件或者静态链接文件复制到该文件夹。 接下来,在Qt的项目配置文件(.pro文件)添加相关的引用和连接信息。使用LIBS变量来指定链接的文件,使用INCLUDEPATH变量来指定头文件的路径。例如,可以使用类似以下的语句进行设置: LIBS += -L"path/to/matlab/lib" -lmatlab INCLUDEPATH += "path/to/matlab/include" 最后,在Qt项目调用Matlab的函数或类。根据需要,可以使用Qt的信号和槽机制来处理Matlab的返回结果,或者使用普通的函数调用。 总的来说,Qt打包Matlab的过程包括将Matlab的头文件和链接文件复制到Qt项目,并且在配置文件添加相关引用和连接信息。然后在Qt项目调用Matlab的函数或类。这样就可以在Qt使用Matlab功能了。 ### 回答2: Qt 是一种跨平台应用程序开发框架,而MATLAB是一种用于数学计算和数据分析的强大软件。将MATLAB打包成Qt应用程序可以实现在Qt界面调用MATLAB函数,从而实现MATLAB功能与Qt界面的结合。 首先,我们需要在Qt项目配置MATLAB。在.pro文件添加以下代码: ``` LIBS += -L"matlabroot\bin\win64" -leng -lmex -lmat //替换为MATLAB安装目录 INCLUDEPATH += "matlabroot\extern\include" //替换为MATLAB安装目录 ``` 然后,我们需要将MATLAB的相关文件复制到Qt项目的目录。这些文件包括libeng.dll、libmex.dll和libmat.dll。可以在MATLAB安装目录的bin\win64文件夹找到它们。将这些文件复制到Qt项目的可执行文件所在的目录。 接下来,在Qt项目创建一个包含MATLAB功能的类。这个类将完成与MATLAB函数的交互,并将其封装到Qt界面。可以使用MATLAB Engine API 来实现与MATLAB之间的通信。例如,可以使用engOpen函数打开MATLAB引擎,使用engEvalString函数执行MATLAB命令,使用engGetVariable函数获取MATLAB变量等。 最后,我们需要在Qt界面调用这个包含MATLAB功能的类。可以在Qt界面通过按钮、菜单等方式触发与MATLAB函数的交互。当用户点击按钮时,Qt界面会调用对应的MATLAB函数,并将结果显示在界面上。 综上所述,将MATLAB打包成Qt应用程序需要配置MATLAB环境,在Qt项目创建相关类来封装与MATLAB的交互,并在Qt界面调用这些类来实现MATLAB功能与Qt界面的结合。这样,就可以在Qt应用程序方便地使用MATLAB。 ### 回答3: Qt是一款跨平台的C++应用程序开发框架,而Matlab是一款数值计算和仿真软件。要在Qt打包Matlab,可以按照以下步骤进行: 第一步,将Matlab导出为C++接口。在Matlab,可以使用MATLAB Compiler将导出为C++可执行文件或文件。这将生成一个接口,可以在Qt调用Matlab。可以根据需要选择要导出的函数和接口。 第二步,将生成的C++接口文件添加到Qt项目。可以在Qt项目目录创建一个文件夹,并将C++接口文件复制到该文件夹。然后,在Qt项目文件(.pro文件)添加对C++文件的引用。这样,Qt就可以使用Matlab的函数和功能。 第三步,配置Qt项目。在Qt项目文件(.pro文件),需要添加Matlab的相关依赖项和链接。可以使用Qt的QMAKE或CMake等工具来配置项目。 第四步,编译和构建Qt项目。完成配置后,可以使用Qt的编译工具(如qmake和make)来编译和构建项目。编译过程会将Matlab的功能与Qt应用程序集成在一起。 最后,执行生成Qt应用程序。完成编译和构建后,可以执行生成Qt应用程序,并测试Matlab的功能是否正常。 总结:在Qt打包Matlab,需要将Matlab导出为C++接口,将接口文件添加到Qt项目,配置项目并编译构建。通过这些步骤,就可以在Qt成功使用Matlab的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值