配置
- Matlab2024a 64位
- MATLAB Runtime 2024
- VS2017 MSVC
- VS-QT插件
步骤
编写matlab测试代码:
matlab
function y = myfunc(a, b)
% a, b 是 double 矩阵或向量
y = a * b;
end
输入mex -setup C++
选择Microsoft Visual C++ 2017
输入deploytool选择
将生成的.h和.lib分别放置在对应的文件夹
附加包含目录:
cpp
C:\Users\woshi\source\repos\QT_Matlab\include
D:\Program Files\MATLAB\R2024a\extern\include
D:\Program Files\MATLAB\R2024a\extern\include\win64
附加库目录:
cpp
C:\Users\woshi\source\repos\QT_Matlab\lib
D:\Program Files\MATLAB\R2024a\extern\lib\win64\microsoft
附加依赖项:
cpp
func.lib
mclmcrrt.lib
libmat.lib
libmx.lib
选择Realse x64
调试-->窗口-->异常设置-->Win32 Exceptions全部不要勾选
VS代码:
cpp
#include "QT_Matlab.h"
#include <QLabel>
#include <QDebug>
#include <QPushButton>
QT_Matlab::QT_Matlab(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
// 手动连接 clicked 信号与槽
connect(ui.pushButton, &QPushButton::clicked,this, &QT_Matlab::on_pushButton_clicked);
// 1. 初始化 MATLAB 运行时(MCR)
if (!mclInitializeApplication(NULL, 0))
{
std::cerr << "Failed to initialize MCR" << std::endl;
}
else
{
std::cout << "Success to initialize MCR" << std::endl;
}
// 2. 初始化你自己导出的 MATLAB 库
if (!funcInitialize()) {
std::cerr << "Failed to initialize MATLAB library" << std::endl;
}
else
{
std::cout << "Success to initialize MATLAB library" << std::endl;
}
}
QT_Matlab::~QT_Matlab()
{
// 在析构 / 退出时清理
funcTerminate();
mclTerminateApplication();
}
void QT_Matlab::on_pushButton_clicked()
{
mwArray aa(1, 1, mxDOUBLE_CLASS, mxREAL);
mwArray bb(1, 1, mxDOUBLE_CLASS, mxREAL);
mwArray cc(1, 1, mxDOUBLE_CLASS, mxREAL);
double a[1] = { 3.0 };
double b[1] = { 5.0 };
double c[1];
aa.SetData(a, 1);
bb.SetData(b, 1);
myfunc(1, cc, aa, bb); //目标函数
cc.GetData(c, 1);
ui.label->setText(QString::number(c[0]));
qDebug() << QString::number(c[0]);
}
测试结果: