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

Qt-17】Qt调用matlab生成dll Qt调用matlab生成dll 阅读详情

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. 在主项目文件中调用这个库

参考链接

Matlab打包为dll使用C++调用 【代码】Matlab打包为dll给Visual Studio调用 阅读详情

相关推荐

Qt调用Matlab(一)

MATLAB是MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。在本文利用Qt通过C/C++来访问Matlab功能。

flysnow010的博客 2169

qt调用matlab程序(mcr)

qt通过mcr调用matlab,解决一些c++难以实现matlab不开源函数什么的问题。

Alittle_can的博客 231

QTmatlab混合调试,MATLAB生成DLL,将多个m文件合生成一个DLL

     最近再做一个项目。用qt有好的界面调用MATLAB已经写好的算法,亲自踩了很多的坑,在这里分享一下:1,混合调试有两种方法,比较主流的就是调用MATLAB生成DLL,进行联调;2,调用MATLAB自身引擎的方法,进行联调;自认为调用MATLAB引擎的方式,在运行QT的时候蹦出来MATLAB的界面,会比较尴尬,最终选择了生成DLL的方法。看着网上的教程,以为会很简单,但是这样简单的东西我...

LittleYoY的专栏 3364

qt调用matlab生成dll

qt调用matlabdll

yang843094036的专栏 4707

【编译matlab函数生成dll

matlab函数编译生成可被C#调用dll

weixin_43339605的博客 4754

Qt调用MATLAB 生成dll经验分享

由于项目需要将生成的数据转成C3D运动捕捉格式,目前无C++转换算法,有MATLAB算法,考虑到C++重新码算法的时间,选择了将MATLAB算法直接转成C++dllQt调用。由于初次搞所以难免踩了很多坑,最后完成后觉得这条路比MATLAB转C++代码更方便快捷(以前多个项目是将MATLAB代码直接手动转C++代码,痛苦的是MATLAB内置算法转换。当然较简单的算法还是直接写C++代码吧,毕竟调用...

King_zkk的博客 9702

VS2017调用MATLAB生成DLL,再打包成DLLQT调用

最近经手的项目需要调用MATLAB算法运算,获取返回的结果,需要先在VS2017中实现调用函数,再将这个函数打包成DLLQT调用,相当于动态链接DLL中还套了一个DLL,实现步骤及主义事项如文章所示。

H1596355913的博客 2226

超详细基于Qt平台实现C/C++调用Matlab函数全流程

基于Qt平台实现C/C++调用Matlab函数,将Matlab函数封装成.dll文件,再在Qt平台上调用.dll文件实现调用Matlab函数。

m15279530607_163的博客 1万+

Qt Creator c++调用Matlab生成dll

目录 m语言生成dllQt Creator中使用c++ 疑问 m语言生成dll 1. 首先编写一个简单的m函数test.m保存 % test.m function ans = test(x,y) ans = x + y; end 2. 在matlab的命令行中输入deploytool按回车键,选择"Library Compiler"。 deploytool...

Stool_Monster的专栏 5943

QTMATLAB混合编程

本文就介绍使用 QtMatlab 进行混合编程的基本流程,主要包括: - 如何在Matlab中将m文件编译为C++语言的DLL文件 - 如何在Qt项目中加入自定义DLL相关的LIB文件,以及MATLAB相关的LIB文件和H文件搜索路径 - MATLAB运行时DLL文件所在路径,及系统相关的环境变量设置 - 如何在Qt调用自定义DLL中的函数,如何通过mwArray类传递输入输出参数

Chris的博客 1万+

qt matlab dll文件,qt调用matlab生成dll

qt调用matlab生成dll我现在在做毕业设计,要做一个软件界面,里面有一个函数是用matlab语言写的,我已经可以再vs2010上调用matlab生成dll了,但是Qt上没办法成功调用。希望大神指导下,谢谢!下面是我的代码项目里面的代码:QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = s...

weixin_33648352的博客 730

基于Qt平台框架实现C/C++调用Matlab动态

Qt 在 Windows 平台的编译环境一般有两种,分别为 MinGW 和 MSVC,为使 DLL 文件的编译平台与 Qt 保持一直,在配置时需要选择相同的编译器,且位数必须一致,比如我使用的环境均为MSVC2017 64bit。MSVC 可以通过安装 Visual Studio 进行配置,网上相关资料很多,这里就不说了。MinGW 没用过,但可以在 MATLAB 附加功能中安装,打开附加功能管理器后,直接搜索。

m0_70572770的博客 2101

QTCreater调用MatLab生成的.dll文件

QTCreater调用Matlab生成的.dll文件

Fight_adu的博客 2856

QT matlab 混编-qt调用matlab生成dll

前言 环境: win10 Qt5.12 mingW(64位) matlab2019a(64位)----mingw w64 主要参考的文章:1. 添加链接描述 (参考其软件 dependency walker 查看dll函数名称) 2.添加链接描述 (重点参考这篇博文,流程完全按照这个流程来的,此流程完全正确) 二、使用步骤 重点注意 1.matlab里的编译器我是后来下的mingw64 >> mex -setup -v 详细模式已开。 ... 正在查找编译器 'Intel Parallel St

antony_z的博客 2550

QT调用MatLab生成DLL,及错误总结(科研配置环境系列)

QT 调用matlab生成DLL时的错误

AaAaBbefqfef的博客 1187

MATLAB函数封装1:生成QT可以调用的.dll动态链接

要想进行函数的封装过程,首先需要MATLAB的app扩展包,这里给出下载好的安装包,用MATLAB打开后可以直接进行安装,这个是安装的编译器,此安装过程不需要卸载已经安装好的MATLAB,重新安装。自己编写的.m函数文件可以封装,同样的对于MATLAB自带的函数也可以进行封装,也可以正常调用,同时对于调用自己的函数的嵌套函数,只要在同一个文件夹下,是可以识别后整体进行封装的,不影响使用过程。封装完成的动态链接想要在QT中进行调用,需要注意所选择的编译器要和QT中使用的编译器保持一致,

qudunan6468的博客 2897
上一篇: VS2022查看C++类内存布局
下一篇: MATLAB头注释模板
Ozzz_
博客等级 码龄11年 1粉丝 3原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值