Qt 调用 MATLAB | 引擎 / 可执行程序 / 动态链接库

发布于:2025-09-02 ⋅ 阅读:(22) ⋅ 点赞:(0)

注:本文为 “Qt 调用 MATLAB” 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。


Qt 调用 MATLAB 引擎混合编程

spic_jackmaster 原创于 2021-12-02 18:31:22 发布

0、前言

C/C++ 调用 MATLAB 主要包含三种方式:调用动态链接库(DLL)文件、调用可执行程序(EXE)以及调用 MATLAB Engine 引擎,三种方式的技术特性与适用场景如下:

  1. 调用 DLL 文件:通过 MATLAB Coder 将 MATLAB 代码转换为 C/C++ 代码及对应的动态链接库。该方式的核心优势在于生成的程序可在未安装 MATLAB 的设备上独立运行,适用于需要脱离 MATLAB 环境部署的场景。

  2. 调用 EXE 可执行程序:利用 MATLAB 将代码编译为 EXE 可执行文件,再由 C/C++ 程序调用该 EXE 实现混合编程。此方式需在目标运行设备上安装 MATLAB Component Runtime(MCR,MATLAB 组件运行时),以提供必要的运行依赖。

  3. 调用 MATLAB Engine 引擎:直接调用 MATLAB 计算引擎,本质为进程级调用——后台启动 MATLAB 应用进程,通过 C API 实现参数传递与计算结果接收。该方式需在设备上预先安装完整的 MATLAB 软件,适用于需实时利用 MATLAB 原生计算能力的场景。

1、环境配置

Qt 调用 MATLAB 引擎的前提条件是 软件位数一致(均为 32 位或均为 64 位),本文实验环境如下:

  • Qt 6.2.1 64bit
  • MATLAB 2018b 64bit
  • MinGW64 版本:mingw810_64

img

img

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 永久配置(系统级生效)

通过设置系统环境变量实现永久生效,步骤如下:

  1. 打开系统环境变量配置界面(Windows 系统:控制面板 → 系统与安全 → 系统 → 高级系统设置 → 环境变量);
  2. 在“系统变量”中新建变量,变量名设为 MW_MINGW64_LOC,变量值设为 MinGW 的实际安装路径;
  3. 点击“确定”保存配置,重启 MATLAB 后配置生效。

img

1.1.3 编译器选择与配置

完成 MinGW 环境变量配置后,在 MATLAB 中配置 C 语言编译器,具体步骤如下:

  1. 在 MATLAB 命令行输入 mbuild -setup,选择“C++”编译器;
  2. 按提示完成配置,确保编译器与 MinGW 路径关联正确。

img

img

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)

img

img

2、测试

以 Qt 调用 MATLAB 引擎绘制正弦函数(y = sin(x))为例,验证配置正确性。

2.1 测试代码核心逻辑

  1. 初始化 MATLAB Engine 引擎;
  2. 通过 engEvalString() 函数执行 MATLAB 命令,生成自变量 x 与因变量 y
  3. 调用 MATLAB plot() 函数绘制图形;
  4. 释放引擎资源。

img

img

2.2 常见问题与解决方案

2.2.1 编译成功但运行崩溃

原因:Qt 程序未找到 MATLAB 的运行时库(如 libeng.dlllibmat.dll 等)。
解决方案:将 MATLAB 的 bin\win64 目录添加至系统环境变量 Path,或在 Qt 项目中指定运行环境:

  • 系统环境变量添加:在 Path 中新增路径 D:\Tools\matlab2018b\bin\win64(路径需替换为实际路径),重启 Qt Creator 后生效;
  • Qt 项目内添加:在 Qt Creator 中打开“项目 → 运行 → 环境”,点击“添加”,变量名设为 Path,变量值追加 MATLAB 的 bin\win64 路径。

img

img

2.2.2 程序启动缓慢

优化方案:保持 MATLAB Command Window 后台运行,下次启动 Qt 程序时可复用已启动的 MATLAB 进程,减少引擎初始化时间。

2.3 参考资料

img

以下无正文。


Qt 调用第三方 MATLAB 库和函数使用

心上枫叶红 原创已于 2022-06-16 16:25:10 修改

1、前提条件

  1. 编译器位数一致性:Qt 编译器与 MATLAB 生成的库文件位数必须一致(均为 32 位或均为 64 位),否则会出现“函数未定义”等链接错误;
  2. 编译器类型:目前实践中,Qt 调用 MATLAB 生成的库文件建议使用 MSVC 编译器(如 MSVC 2010),MinGW 编译器可能存在兼容性问题(具体需结合版本验证);
  3. 运行时环境:需在目标设备上安装 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 为例):

  1. D:\MCR\v95\bin(MCR 核心运行库路径,版本号 v95 需根据实际安装的 MCR 版本调整);
  2. D:\MCR\v95\bin\win64(64 位系统专用运行库路径);
  3. D:\MCR\v95\runtime\win64(MCR 运行时核心路径)。

配置方式:在 Qt Creator 中打开“项目 → 运行 → 环境”,点击“添加”,逐一添加上述路径至 Path 变量。

img

img

img

3.2 第三方库(LIB)配置

以调用 MATLAB 生成的 MotionCalc.lib 为例,配置步骤如下:

  1. 文件拷贝

    • MotionCalc.dll 拷贝至 Qt 项目的构建目录(如 build-ProjectName-Desktop_Qt_6_2_1_MinGW_64_bit-Debug);
    • MotionCalc.hMotionCalc.lib 拷贝至 Qt 项目的源代码目录(与 .pro 文件同级)。
  2. .pro 文件配置
    在 .pro 文件中添加库文件链接路径与头文件路径,示例如下:

    # 头文件路径
    INCLUDEPATH += ./
    
    # 库文件路径与依赖
    LIBS += ./MotionCalc.lib
    
  3. 头文件包含
    在需要调用库函数的 Qt 源文件(如 .cpp)中,包含 MotionCalc.h 头文件:

    #include "MotionCalc.h"
    

img

img

3.3 函数调用说明

库文件中函数的名称与参数格式需参考原 MATLAB 工程的设计文档,确保调用时参数类型、数量与 MATLAB 函数定义一致。


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

镜澈须臾 原创于 2023-03-13 19:45:11 发布

1、基本调用方式介绍

基于 Qt 平台的 C/C++ 调用 MATLAB 函数主要包含三种技术路径,各路径的核心原理与适用场景如下:

  1. 路径 1:调用 MATLAB 生成的 DLL 文件
    将 MATLAB 函数通过 MATLAB Compiler 编译为动态链接库(DLL),再由 Qt 中的 C/C++ 代码调用该 DLL。该方式可脱离 MATLAB 环境运行(需安装 MCR),是工程化部署的常用方案,本文重点介绍此路径。

  2. 路径 2:调用 MATLAB 生成的 EXE 文件
    将 MATLAB 函数编译为可执行程序(EXE),Qt 程序通过进程调用(如 QProcess)执行该 EXE,实现功能交互。该方式适用于简单功能调用,但参数传递效率较低。

  3. 路径 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 组件。

检查 mcc 编译器是否可用

4.2 配置编译器

4.2.1 配置 mbuild(生成可执行文件/库文件的编译器)

在 MATLAB 命令行输入如下命令,选择与 Qt 一致的 C++ 编译器(如 MinGW64):

mbuild -setup

按提示选择“mex -setup C++ -client MBUILD”,完成 mbuild 配置。

Matlab 配置编译器

4.2.2 配置 mex(生成 MEX 文件的编译器)

继续在 MATLAB 命令行输入如下命令,配置 mex 编译器为 C++:

mex -setup

按提示选择 C++ 编译器,确保与 mbuild 配置的编译器一致。

配置为 C++

注意:MATLAB 每次重启后,需重新执行上述 mbuild -setupmex -setup 命令,确保编译器配置生效。

4.3 生成 DLL 文件

通过 MATLAB 的 Library Compiler 工具生成 DLL,步骤如下:

  1. 打开 Library Compiler:在 MATLAB 主界面的“APP”标签页中,搜索并点击“Library Compiler”;
  2. 选择输出类型:在“TYPE”下拉菜单中选择“C++ Shared Library”;
  3. 添加待编译函数:点击“EXPORTED FUNCTIONS”下方的“Add”按钮,选择前文编写的 matrix_mult.m 函数;
  4. 配置输出路径:点击“Package”按钮,选择 DLL 文件的输出目录,点击“Save”开始编译;
  5. 编译完成:编译成功后,输出目录会生成 for_testingfor_redistributionfor_redistribution_files_only 三个子目录,其中 for_redistribution_files_only 目录包含 Qt 所需的 DLL、LIB 与 H 文件。

选择 Library Complier

导出动态链接库

保存文件

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 手动添加外部库(可选)

若通过图形化界面添加库文件,步骤如下:

  1. 在 Qt Creator 中右键点击项目名称,选择“添加库”→“外部库”;
  2. 点击“浏览”,选择 matrix_mult.lib 文件的路径;
  3. 取消勾选“Linux”与“Mac”(仅保留 Windows 平台),取消勾选“为 debug 版本添加‘d’作为后缀”;
  4. 点击“下一步”,Qt 会自动在 .pro 文件中添加如下配置:
    win32: LIBS += -L$$PWD/./ -lmatrix_mult
    INCLUDEPATH += $$PWD/.
    DEPENDPATH += $$PWD/.
    

Qt 中添加 .dll 库

Qt 中添加 .dll 库

Qt 添加 .dll 库

5.3 头文件包含

在需要调用 DLL 函数的 Qt 源文件(如 mainwindow.cpp)中,包含 MATLAB 生成的头文件:

#include "matrix_mult.h"

在工程的头文件中添加生成的 matlab 库的头文件

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 类参考资料

7、常见问题及解决方案

参考第三方问题解决文档:


基于 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 编译器必须满足两个条件:

  1. 位数一致(均为 32 位或均为 64 位),否则会出现“函数未定义”“链接错误”等问题;
  2. 类型匹配(如 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 命令,确保编译器配置生效。

img

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,步骤如下:

  1. 打开 Library Compiler:在 MATLAB 命令行输入 deploytool,或在“APP”标签页中点击“Library Compiler”;
  2. 选择输出类型:在“TYPE”下拉菜单中选择“C++ Shared Library”;
  3. 添加函数:点击“EXPORTED FUNCTIONS”下方的“Add”,选择 add_matlab.m 函数;
  4. 生成 DLL:点击“Package”,选择输出目录,MATLAB 会自动编译并生成三个子目录:
    • for_testing:用于 MATLAB 环境下测试 DLL 正确性;
    • for_redistribution:包含 MCR 安装程序与 DLL 安装包,用于部署到无 MATLAB 环境的设备;
    • for_redistribution_files_only:包含 Qt 所需的 DLL、LIB 与 H 文件(核心文件目录)。

img

img

img

img

补充说明for_redistribution_files_only 目录下的 .ctf 文件(如 add_matlab.ctf)为 MATLAB 编译后的资源文件,部分低版本 MATLAB 生成的 DLL 需该文件才能正常初始化,建议将其与 DLL 文件一同放入 Qt 项目的构建目录。

二、Qt 调用 DLL 文件

2.1 项目文件准备

  1. 在 Qt 项目目录下新建 matlab_libs 文件夹(名称可自定义);
  2. for_redistribution_files_only 目录下的所有文件(add_matlab.dlladd_matlab.libadd_matlab.hadd_matlab.ctf)拷贝至 matlab_libs 文件夹。

2.2 添加外部库

在 Qt Creator 中通过图形化界面添加 add_matlab.lib,步骤如下:

  1. 右键点击项目名称,选择“添加库”→“外部库”;
  2. 点击“浏览”,选择 matlab_libs 目录下的 add_matlab.lib 文件;
  3. 取消勾选“Linux”与“Mac”,取消勾选“为 debug 版本添加‘d’作为后缀”;
  4. 点击“下一步”,Qt 会自动在 .pro 文件中添加如下配置:
    win32: LIBS += -L$$PWD/matlab_libs/ -ladd_matlab
    INCLUDEPATH += $$PWD/matlab_libs
    DEPENDPATH += $$PWD/matlab_libs
    

img

img

2.3 添加 MATLAB 基础依赖

Qt 调用 MATLAB 生成的 DLL 需依赖 MATLAB 的基础库(如 libmx.libmclmcrrt.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:

  1. for_redistribution 目录获取 MyAppInstaller_web.exe,或从 MathWorks 官网下载对应版本的 MCR;
  2. 在目标设备上安装 MCR,默认路径为 C:\Program Files\MATLAB\MATLAB_Runtime\vXX(XX 为版本号);
  3. 将 MCR 的 bin\win64 目录(如 C:\Program Files\MATLAB\MATLAB_Runtime\v95\bin\win64)添加至系统环境变量 Path

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& aconst 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:


网站公告

今日签到

点亮在社区的每一天
去签到