注:本文为 “Qt 调用 MATLAB” 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。
Qt 调用 MATLAB 引擎混合编程
spic_jackmaster 原创于 2021-12-02 18:31:22 发布
0、前言
C/C++ 调用 MATLAB 主要包含三种方式:调用动态链接库(DLL)文件、调用可执行程序(EXE)以及调用 MATLAB Engine 引擎,三种方式的技术特性与适用场景如下:
调用 DLL 文件:通过 MATLAB Coder 将 MATLAB 代码转换为 C/C++ 代码及对应的动态链接库。该方式的核心优势在于生成的程序可在未安装 MATLAB 的设备上独立运行,适用于需要脱离 MATLAB 环境部署的场景。
调用 EXE 可执行程序:利用 MATLAB 将代码编译为 EXE 可执行文件,再由 C/C++ 程序调用该 EXE 实现混合编程。此方式需在目标运行设备上安装 MATLAB Component Runtime(MCR,MATLAB 组件运行时),以提供必要的运行依赖。
调用 MATLAB Engine 引擎:直接调用 MATLAB 计算引擎,本质为进程级调用——后台启动 MATLAB 应用进程,通过 C API 实现参数传递与计算结果接收。该方式需在设备上预先安装完整的 MATLAB 软件,适用于需实时利用 MATLAB 原生计算能力的场景。
1、环境配置
Qt 调用 MATLAB 引擎的前提条件是 软件位数一致(均为 32 位或均为 64 位),本文实验环境如下:
- Qt 6.2.1 64bit
- MATLAB 2018b 64bit
- MinGW64 版本:mingw810_64
1.1 MATLAB 配置 C 编译器
需将 MATLAB 的 C 编译器配置为与 Qt 一致的 MinGW(若未安装 MinGW,需先下载;因 Qt 安装过程中已可选安装 MinGW,可直接复用该版本)。MinGW 环境变量的配置方式分为临时配置与永久配置:
1.1.1 临时配置(单次有效)
在 MATLAB 命令行中执行如下命令,设置 MinGW 路径(路径需替换为实际的 MinGW 安装路径):
setenv('MW_MINGW64_LOC','D:\Tools\Qt_6.2.0_64Bit\Qt\Tools\mingw810_64')
该配置仅对当前 MATLAB 进程有效,关闭 MATLAB 后需重新设置。
1.1.2 永久配置(系统级生效)
通过设置系统环境变量实现永久生效,步骤如下:
- 打开系统环境变量配置界面(Windows 系统:控制面板 → 系统与安全 → 系统 → 高级系统设置 → 环境变量);
- 在“系统变量”中新建变量,变量名设为
MW_MINGW64_LOC
,变量值设为 MinGW 的实际安装路径; - 点击“确定”保存配置,重启 MATLAB 后配置生效。
1.1.3 编译器选择与配置
完成 MinGW 环境变量配置后,在 MATLAB 中配置 C 语言编译器,具体步骤如下:
- 在 MATLAB 命令行输入
mbuild -setup
,选择“C++”编译器; - 按提示完成配置,确保编译器与 MinGW 路径关联正确。
1.2 Qt 配置 MATLAB Engine 环境
在 Qt 项目文件(.pro 文件)中添加 MATLAB Engine 的依赖项,包括头文件路径与库文件路径,具体配置如下:
1.2.1 基础依赖配置
在 .pro 文件中添加如下代码,指定 MATLAB 头文件与库文件的路径(路径需替换为实际的 MATLAB 安装路径):
# 头文件路径
INCLUDEPATH += D:\Tools\matlab2018b\extern\include
INCLUDEPATH += D:\Tools\matlab2018b\extern\include\win64
# 库文件路径与库依赖
LIBS += D:\Tools\matlab2018b\extern\lib\win64\mingw64\libeng.lib
LIBS += D:\Tools\matlab2018b\extern\lib\win64\mingw64\libmat.lib
LIBS += D:\Tools\matlab2018b\extern\lib\win64\mingw64\libmx.lib
LIBS += D:\Tools\matlab2018b\extern\lib\win64\mingw64\libmex.lib
1.2.2 路径含空格的处理
若 MATLAB 安装路径含空格(如 C:\Program Files\MATLAB\R2018b
),需使用 Qt 的 $$quote()
函数包裹路径,避免解析错误,示例如下:
INCLUDEPATH += $$quote(C:\Program Files\MATLAB\R2018b\extern\include)
LIBS += $$quote(C:\Program Files\MATLAB\R2018b\extern\lib\win64\mingw64\libeng.lib)
2、测试
以 Qt 调用 MATLAB 引擎绘制正弦函数(y = sin(x)
)为例,验证配置正确性。
2.1 测试代码核心逻辑
- 初始化 MATLAB Engine 引擎;
- 通过
engEvalString()
函数执行 MATLAB 命令,生成自变量x
与因变量y
; - 调用 MATLAB
plot()
函数绘制图形; - 释放引擎资源。
2.2 常见问题与解决方案
2.2.1 编译成功但运行崩溃
原因:Qt 程序未找到 MATLAB 的运行时库(如 libeng.dll
、libmat.dll
等)。
解决方案:将 MATLAB 的 bin\win64
目录添加至系统环境变量 Path
,或在 Qt 项目中指定运行环境:
- 系统环境变量添加:在
Path
中新增路径D:\Tools\matlab2018b\bin\win64
(路径需替换为实际路径),重启 Qt Creator 后生效; - Qt 项目内添加:在 Qt Creator 中打开“项目 → 运行 → 环境”,点击“添加”,变量名设为
Path
,变量值追加 MATLAB 的bin\win64
路径。
2.2.2 程序启动缓慢
优化方案:保持 MATLAB Command Window 后台运行,下次启动 Qt 程序时可复用已启动的 MATLAB 进程,减少引擎初始化时间。
2.3 参考资料
- 从 C 调用 MATLAB - MATLAB & Simulink
https://ww2.mathworks.cn/help/matlab/calling-matlab-engine-from-c-programs-1.html
以下无正文。
Qt 调用第三方 MATLAB 库和函数使用
心上枫叶红 原创已于 2022-06-16 16:25:10 修改
1、前提条件
- 编译器位数一致性:Qt 编译器与 MATLAB 生成的库文件位数必须一致(均为 32 位或均为 64 位),否则会出现“函数未定义”等链接错误;
- 编译器类型:目前实践中,Qt 调用 MATLAB 生成的库文件建议使用 MSVC 编译器(如 MSVC 2010),MinGW 编译器可能存在兼容性问题(具体需结合版本验证);
- 运行时环境:需在目标设备上安装 MATLAB MCR(MATLAB Component Runtime),以提供库文件运行所需的依赖。
2、MATLAB MCR 安装
2.1 安装包获取
MATLAB MCR 安装包可通过 MathWorks 官网下载,或参考以下百度网盘链接(链接有效性自行验证):
MCRInstaller.exe_|百度网盘
2.2 安装步骤
按照安装向导完成 MCR 安装,记录安装路径(如 D:\MCR
),后续配置需使用该路径。
3、Qt 项目环境配置
3.1 环境变量添加
在 Qt 项目中添加 MCR 的环境变量,需包含以下三个路径(以安装路径 D:\MCR
为例):
D:\MCR\v95\bin
(MCR 核心运行库路径,版本号v95
需根据实际安装的 MCR 版本调整);D:\MCR\v95\bin\win64
(64 位系统专用运行库路径);D:\MCR\v95\runtime\win64
(MCR 运行时核心路径)。
配置方式:在 Qt Creator 中打开“项目 → 运行 → 环境”,点击“添加”,逐一添加上述路径至 Path
变量。
3.2 第三方库(LIB)配置
以调用 MATLAB 生成的 MotionCalc.lib
为例,配置步骤如下:
文件拷贝:
- 将
MotionCalc.dll
拷贝至 Qt 项目的构建目录(如build-ProjectName-Desktop_Qt_6_2_1_MinGW_64_bit-Debug
); - 将
MotionCalc.h
与MotionCalc.lib
拷贝至 Qt 项目的源代码目录(与.pro
文件同级)。
- 将
.pro 文件配置:
在 .pro 文件中添加库文件链接路径与头文件路径,示例如下:# 头文件路径 INCLUDEPATH += ./ # 库文件路径与依赖 LIBS += ./MotionCalc.lib
头文件包含:
在需要调用库函数的 Qt 源文件(如.cpp
)中,包含MotionCalc.h
头文件:#include "MotionCalc.h"
3.3 函数调用说明
库文件中函数的名称与参数格式需参考原 MATLAB 工程的设计文档,确保调用时参数类型、数量与 MATLAB 函数定义一致。
超详细基于 Qt 平台实现 C/C++ 调用 Matlab 函数全流程
镜澈须臾 原创于 2023-03-13 19:45:11 发布
1、基本调用方式介绍
基于 Qt 平台的 C/C++ 调用 MATLAB 函数主要包含三种技术路径,各路径的核心原理与适用场景如下:
路径 1:调用 MATLAB 生成的 DLL 文件
将 MATLAB 函数通过 MATLAB Compiler 编译为动态链接库(DLL),再由 Qt 中的 C/C++ 代码调用该 DLL。该方式可脱离 MATLAB 环境运行(需安装 MCR),是工程化部署的常用方案,本文重点介绍此路径。路径 2:调用 MATLAB 生成的 EXE 文件
将 MATLAB 函数编译为可执行程序(EXE),Qt 程序通过进程调用(如QProcess
)执行该 EXE,实现功能交互。该方式适用于简单功能调用,但参数传递效率较低。路径 3:调用 MATLAB Engine 引擎
直接启动 MATLAB 引擎进程,通过 C API 实现参数传递与函数调用。该方式需安装完整 MATLAB,适用于需实时利用 MATLAB 原生功能的场景,具体可参考前文“Qt 调用 MATLAB 引擎混合编程”。
2、环境配置
2.1 核心要求
编译器位数一致性:Qt 编译器、MATLAB 及生成的 DLL 文件位数必须完全一致(均为 64 位或均为 32 位),否则会出现“函数未定义”“链接失败”等错误。
2.2 实验环境
- Qt 5.14.2
- MATLAB 2020b
- MinGW64(与 Qt 编译器版本匹配,如 mingw810_64)
3、MATLAB 函数编写
将需调用的 MATLAB 功能封装为函数形式,确保输入/输出参数定义清晰。示例如下(以计算两个矩阵的乘积为例):
function [C] = matrix_mult(A, B)
% 矩阵乘法函数:输入两个矩阵 A、B,输出乘积矩阵 C
% 输入参数:A (m×n 矩阵),B (n×p 矩阵)
% 输出参数:C (m×p 矩阵),C = A × B
C = A * B;
end
3.1 函数验证
在 MATLAB 命令行中调用该函数,验证逻辑正确性。例如:
A = [1 2; 3 4];
B = [5 6; 7 8];
C = matrix_mult(A, B);
% 预期输出:C = [19 22; 43 50]
4、MATLAB 配置 C 编译器并生成 DLL
4.1 验证 mcc 编译器可用性
mcc(MATLAB Compiler)是生成 DLL 文件的核心工具,首先在 MATLAB 命令行中验证其可用性:
>> !mcc
若输出 mcc 编译器的帮助信息(如参数说明、用法示例),则表明编译器可用;若提示“mcc 不是内部或外部命令”,需检查 MATLAB 安装路径是否正确,或重新安装 MATLAB Compiler 组件。
4.2 配置编译器
4.2.1 配置 mbuild(生成可执行文件/库文件的编译器)
在 MATLAB 命令行输入如下命令,选择与 Qt 一致的 C++ 编译器(如 MinGW64):
mbuild -setup
按提示选择“mex -setup C++ -client MBUILD”,完成 mbuild 配置。
4.2.2 配置 mex(生成 MEX 文件的编译器)
继续在 MATLAB 命令行输入如下命令,配置 mex 编译器为 C++:
mex -setup
按提示选择 C++ 编译器,确保与 mbuild 配置的编译器一致。
注意:MATLAB 每次重启后,需重新执行上述 mbuild -setup
与 mex -setup
命令,确保编译器配置生效。
4.3 生成 DLL 文件
通过 MATLAB 的 Library Compiler 工具生成 DLL,步骤如下:
- 打开 Library Compiler:在 MATLAB 主界面的“APP”标签页中,搜索并点击“Library Compiler”;
- 选择输出类型:在“TYPE”下拉菜单中选择“C++ Shared Library”;
- 添加待编译函数:点击“EXPORTED FUNCTIONS”下方的“Add”按钮,选择前文编写的
matrix_mult.m
函数; - 配置输出路径:点击“Package”按钮,选择 DLL 文件的输出目录,点击“Save”开始编译;
- 编译完成:编译成功后,输出目录会生成
for_testing
、for_redistribution
、for_redistribution_files_only
三个子目录,其中for_redistribution_files_only
目录包含 Qt 所需的 DLL、LIB 与 H 文件。
5、Qt 调用 DLL 文件
5.1 .pro 文件配置
在 Qt 项目的 .pro 文件中,添加 MATLAB 依赖库与头文件的路径,示例如下(路径需替换为实际的 MATLAB 安装路径):
# MATLAB 头文件路径
INCLUDEPATH += D:/Matlab_2020_anzhuang/extern/include
INCLUDEPATH += D:/Matlab_2020_anzhuang/extern/include/win64
# MATLAB 基础依赖库(需与编译器位数匹配,此处为 64 位 MinGW)
LIBS += D:/Matlab_2020_anzhuang/extern/lib/win64/mingw64/libeng.lib
LIBS += D:/Matlab_2020_anzhuang/extern/lib/win64/mingw64/libmat.lib
LIBS += D:/Matlab_2020_anzhuang/extern/lib/win64/mingw64/libmx.lib
LIBS += D:/Matlab_2020_anzhuang/extern/lib/win64/mingw64/libmex.lib
LIBS += D:/Matlab_2020_anzhuang/extern/lib/win64/mingw64/mclmcr.lib
LIBS += D:/Matlab_2020_anzhuang/extern/lib/win64/mingw64/mclmcrrt.lib
# 自定义 MATLAB 库(matrix_mult.lib)路径(需替换为实际路径)
LIBS += D:/MATLAB_Projects/matrix_mult/for_redistribution_files_only/matrix_mult.lib
INCLUDEPATH += D:/MATLAB_Projects/matrix_mult/for_redistribution_files_only
5.2 手动添加外部库(可选)
若通过图形化界面添加库文件,步骤如下:
- 在 Qt Creator 中右键点击项目名称,选择“添加库”→“外部库”;
- 点击“浏览”,选择
matrix_mult.lib
文件的路径; - 取消勾选“Linux”与“Mac”(仅保留 Windows 平台),取消勾选“为 debug 版本添加‘d’作为后缀”;
- 点击“下一步”,Qt 会自动在 .pro 文件中添加如下配置:
win32: LIBS += -L$$PWD/./ -lmatrix_mult INCLUDEPATH += $$PWD/. DEPENDPATH += $$PWD/.
5.3 头文件包含
在需要调用 DLL 函数的 Qt 源文件(如 mainwindow.cpp
)中,包含 MATLAB 生成的头文件:
#include "matrix_mult.h"
6、Qt 中编写 DLL 调用代码
6.1 DLL 初始化
调用 MATLAB 生成的 DLL 前,必须先初始化库环境,调用头文件中定义的初始化函数(函数名格式为 库名Initialize
,如 matrix_multInitialize()
):
#include <QDebug>
#include "matrix_mult.h"
// 初始化 DLL
if (!matrix_multInitialize())
{
qDebug() << "MATLAB DLL 初始化失败!";
return -1;
}
6.2 参数传递与函数调用
MATLAB 生成的 DLL 接口函数参数均为 mwArray
类型(MATLAB 数组类),需先定义 mwArray
类型的输入/输出参数,再调用目标函数。
6.2.1 mwArray
类型说明
mwArray
是 MATLAB 用于跨语言参数传递的核心类,支持多种数据类型(如整数、浮点数、矩阵)与维度(标量、向量、矩阵),具体使用方法可参考 MATLAB 官方文档或第三方教程。
6.2.2 调用示例(矩阵乘法)
// 1. 定义输入矩阵(2×2 矩阵)
double A_data[] = {1, 2, 3, 4}; // 矩阵 A = [1 2; 3 4]
double B_data[] = {5, 6, 7, 8}; // 矩阵 B = [5 6; 7 8]
// 2. 初始化 mwArray 类型参数(维度:行×列,数据类型:mxDOUBLE_CLASS)
mwArray A(2, 2, mxDOUBLE_CLASS);
mwArray B(2, 2, mxDOUBLE_CLASS);
mwArray C(2, 2, mxDOUBLE_CLASS); // 输出矩阵 C
// 3. 为 mwArray 赋值(SetData(数据指针, 数据长度))
A.SetData(A_data, 4);
B.SetData(B_data, 4);
// 4. 调用 DLL 中的矩阵乘法函数(函数名:matrix_mult,参数格式:输出参数个数, 输出参数, 输入参数1, 输入参数2)
matrix_mult(1, C, A, B);
// 5. 读取输出结果(将 mwArray 转换为 C++ 数组)
double C_data[4];
C.GetData(C_data, 4);
// 6. 打印结果
qDebug() << "矩阵 C = A × B 的结果:";
qDebug() << C_data[0] << " " << C_data[1];
qDebug() << C_data[2] << " " << C_data[3];
// 预期输出:19 22; 43 50
6.3 mwArray
类参考资料
- Qt 与 Matlab 混合编程中 mwArray 数组使用详解 - CSDN 博客
https://blog.csdn.net/HongAndYi/article/details/79477031
7、常见问题及解决方案
参考第三方问题解决文档:
- 基于 Qt 平台实现 C/C++ 调用 Matlab 函数,完成基于 Qt+Matlab 的异常数据处理、检测与结果显示等功能的软件超详细过程_qt 调用 matlab 函数资源 - CSDN 下载
https://download.csdn.net/download/m15279530607_163/87563724
基于 Qt 平台框架实现 C/C++ 调用 Matlab 动态库
饺子ゼ 原创于 2023-12-07 14:19:33 发布
本文聚焦于 Qt 平台下 C/C++ 代码调用 MATLAB 生成的动态共享库(DLL)的技术流程,其他调用方式(如 Engine 引擎、EXE 调用)可参考其他文档。
一、MATLAB 生成 DLL 文件
1.1 编译环境配置
1.1.1 核心要求
编译器位数与类型一致性:Qt 编译器与 MATLAB 生成的 DLL 编译器必须满足两个条件:
- 位数一致(均为 32 位或均为 64 位),否则会出现“函数未定义”“链接错误”等问题;
- 类型匹配(如 Qt 使用 MSVC 2017 64bit,则 MATLAB 需配置相同的 MSVC 编译器)。
1.1.2 编译器安装与配置
- MSVC 编译器:通过安装 Visual Studio(如 VS 2017)配置,MATLAB 会自动识别已安装的 MSVC 编译器;
- MinGW 编译器:在 MATLAB 的“附加功能管理器”中搜索“MinGW”,安装对应的 MinGW 组件(需与 Qt 的 MinGW 版本匹配)。
1.1.3 验证与配置编译器
在 MATLAB 命令行输入如下命令,查看并配置编译器:
mbuild -setup
按提示选择与 Qt 一致的 C++ 编译器(如“Microsoft Visual C++ 2017 (C++)”),完成配置。
注意:MATLAB 每次重启后,需重新执行 mbuild -setup
命令,确保编译器配置生效。
1.2 编写 MATLAB 函数
以简单的两数相加函数为例,创建 add_matlab.m
文件,代码如下:
function c = add_matlab(a, b)
% 两数相加函数:输入两个标量 a、b,输出和 c
% 输入参数:a (double 标量),b (double 标量)
% 输出参数:c (double 标量),c = a + b
c = a + b;
end
1.3 生成 DLL 文件
通过 MATLAB 的 Library Compiler 工具生成 DLL,步骤如下:
- 打开 Library Compiler:在 MATLAB 命令行输入
deploytool
,或在“APP”标签页中点击“Library Compiler”; - 选择输出类型:在“TYPE”下拉菜单中选择“C++ Shared Library”;
- 添加函数:点击“EXPORTED FUNCTIONS”下方的“Add”,选择
add_matlab.m
函数; - 生成 DLL:点击“Package”,选择输出目录,MATLAB 会自动编译并生成三个子目录:
for_testing
:用于 MATLAB 环境下测试 DLL 正确性;for_redistribution
:包含 MCR 安装程序与 DLL 安装包,用于部署到无 MATLAB 环境的设备;for_redistribution_files_only
:包含 Qt 所需的 DLL、LIB 与 H 文件(核心文件目录)。
补充说明:for_redistribution_files_only
目录下的 .ctf
文件(如 add_matlab.ctf
)为 MATLAB 编译后的资源文件,部分低版本 MATLAB 生成的 DLL 需该文件才能正常初始化,建议将其与 DLL 文件一同放入 Qt 项目的构建目录。
二、Qt 调用 DLL 文件
2.1 项目文件准备
- 在 Qt 项目目录下新建
matlab_libs
文件夹(名称可自定义); - 将
for_redistribution_files_only
目录下的所有文件(add_matlab.dll
、add_matlab.lib
、add_matlab.h
、add_matlab.ctf
)拷贝至matlab_libs
文件夹。
2.2 添加外部库
在 Qt Creator 中通过图形化界面添加 add_matlab.lib
,步骤如下:
- 右键点击项目名称,选择“添加库”→“外部库”;
- 点击“浏览”,选择
matlab_libs
目录下的add_matlab.lib
文件; - 取消勾选“Linux”与“Mac”,取消勾选“为 debug 版本添加‘d’作为后缀”;
- 点击“下一步”,Qt 会自动在 .pro 文件中添加如下配置:
win32: LIBS += -L$$PWD/matlab_libs/ -ladd_matlab INCLUDEPATH += $$PWD/matlab_libs DEPENDPATH += $$PWD/matlab_libs
2.3 添加 MATLAB 基础依赖
Qt 调用 MATLAB 生成的 DLL 需依赖 MATLAB 的基础库(如 libmx.lib
、mclmcrrt.lib
),在 .pro 文件中添加如下配置(路径需替换为实际的 MCR 或 MATLAB 安装路径):
# MATLAB 基础库路径(以 MCR 安装路径为例,版本号 v95 需根据实际调整)
LIBS += -LD:/MATLAB/MATLAB_Runtime/v95/extern/lib/win64/microsoft/ -llibmx
LIBS += -LD:/MATLAB/MATLAB_Runtime/v95/extern/lib/win64/microsoft/ -llibmat
LIBS += -LD:/MATLAB/MATLAB_Runtime/v95/extern/lib/win64/microsoft/ -llibeng
LIBS += -LD:/MATLAB/MATLAB_Runtime/v95/extern/lib/win64/microsoft/ -lmclmcr
LIBS += -LD:/MATLAB/MATLAB_Runtime/v95/extern/lib/win64/microsoft/ -lmclmcrrt
LIBS += -LD:/MATLAB/MATLAB_Runtime/v95/extern/lib/win64/microsoft/ -llibmex
# MATLAB 头文件路径
INCLUDEPATH += D:/MATLAB/MATLAB_Runtime/v95/extern/include
INCLUDEPATH += D:/MATLAB/MATLAB_Runtime/v95/extern/include/win64
路径含空格的处理
若路径含空格(如 C:\Program Files\MATLAB\MATLAB_Runtime\v95
),需使用 $$quote()
包裹路径:
INCLUDEPATH += $$quote(C:\Program Files\MATLAB\MATLAB_Runtime\v95\extern/include)
LIBS += -L$$quote(C:\Program Files\MATLAB\MATLAB_Runtime\v95\extern/lib/win64/microsoft/) -llibmx
2.4 运行时环境配置(部署场景)
若需在未安装 MATLAB 的设备上运行 Qt 程序,需安装与 MATLAB 版本匹配的 MCR:
- 从
for_redistribution
目录获取MyAppInstaller_web.exe
,或从 MathWorks 官网下载对应版本的 MCR; - 在目标设备上安装 MCR,默认路径为
C:\Program Files\MATLAB\MATLAB_Runtime\vXX
(XX 为版本号); - 将 MCR 的
bin\win64
目录(如C:\Program Files\MATLAB\MATLAB_Runtime\v95\bin\win64
)添加至系统环境变量Path
。
- MATLAB Runtime - MATLAB Compiler - MATLAB
https://ww2.mathworks.cn/products/compiler/matlab-runtime.html
2.5 DLL 函数调用
2.5.1 头文件包含
在 Qt 源文件中包含 add_matlab.h
:
#include "matlab_libs/add_matlab.h"
#include <QDebug>
2.5.2 DLL 初始化
调用 add_matlab()
函数前,必须先调用初始化函数 add_matlabInitialize()
:
// 初始化 DLL
if (!add_matlabInitialize())
{
qDebug() << "add_matlab DLL 初始化失败!";
return;
}
2.5.3 函数接口说明
add_matlab.h
中定义的函数接口如下:
extern LIB_add_matlab_CPP_API void MW_CALL_CONV add_matlab(int nargout, mwArray& c, const mwArray& a, const mwArray& b);
nargout
:输出参数个数(此处为 1,即仅c
为输出参数);mwArray& c
:输出参数(两数之和);const mwArray& a
、const mwArray& b
:输入参数(待相加的两个标量)。
2.5.4 mwArray
类使用
mwArray
是 MATLAB 用于跨语言参数传递的核心类,支持标量、向量、矩阵等数据类型,常用方法包括:
mwArray(行数, 列数, 数据类型)
:构造函数,数据类型如mxDOUBLE_CLASS
(双精度浮点数);SetData(数据指针, 数据长度)
:为mwArray
赋值;GetData(数据指针, 数据长度)
:从mwArray
读取数据;Real().ToString()
:将mwArray
转换为字符串(用于调试)。mwArray 使用详解-CSDN博客
https://blog.csdn.net/yujiao12365/article/details/79533121
2.5.5 调用示例代码
#include "matlabtest.h"
#include "ui_matlabtest.h"
#include "matlab_libs/add_matlab.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1. 初始化 DLL
if (!add_matlabInitialize())
{
qDebug() << "add_matlab unsuccessfully initialized";
return;
}
// 2. 调用两数相加函数
ccc();
}
Widget::~Widget()
{
delete ui;
}
void Widget::ccc()
{
// 定义输入数据
double a = 6.3;
double b = 9.2;
// 初始化 mwArray 类型参数(1×1 标量,双精度浮点数)
mwArray mwA(1, 1, mxDOUBLE_CLASS);
mwArray mwB(1, 1, mxDOUBLE_CLASS);
mwArray mwC(1, 1, mxDOUBLE_CLASS); // 输出参数
// 为输入参数赋值
mwA.SetData(&a, 1); // 数据长度为 1(标量)
mwB.SetData(&b, 1);
// 打印输入参数(调试用)
qDebug() << "输入 a = " << mwA.Real().ToString();
qDebug() << "输入 b = " << mwB.Real().ToString();
// 调用 DLL 函数(nargout=1,输出参数为 mwC)
add_matlab(1, mwC, mwA, mwB);
// 打印输出结果
qDebug() << "输出 c = a + b = " << mwC.Real().ToString();
// 预期输出:c = 15.5
}
via:
- Qt 调用 MATLAB 引擎混合编程_qt matlab 混合编程 - CSDN 博客
https://blog.csdn.net/u010058695/article/details/121682716 - QT 调用第三方 MATLAB 库和函数使用_qt 调用 matlab 函数 - CSDN 博客
https://blog.csdn.net/qq_41133610/article/details/82628666 - 超详细基于 Qt 平台实现 C/C++ 调用 Matlab 函数全流程_qt 调用 matlab-CSDN 博客
https://blog.csdn.net/m15279530607_163/article/details/129471386 - 基于 Qt 平台框架实现 C/C++ 调用 Matlab 动态库_c++ 调用 matlab 的 dll-CSDN 博客
https://blog.csdn.net/m0_70572770/article/details/134850007 - Qt 与 Matlab 混合编程中 mwArray 数组使用详解 - CSDN 博客
https://blog.csdn.net/HongAndYi/article/details/79477031
常见问题参考- QT 与 matlab 混编及完整错误详解_mclmcrrt.h-CSDN 博客
https://blog.csdn.net/weixin_42490786/article/details/120834808 - QT 和 matlab 混合编程以及 maltab 程序化初始化失败_qt matlab-CSDN 博客
https://blog.csdn.net/qq_45179361/article/details/128098901
- QT 与 matlab 混编及完整错误详解_mclmcrrt.h-CSDN 博客