【Qt-17】Qt调用matlab生成的dll库

matlab生成dll库

1、matlab示例代码

复制代码
function BDCube(x,y)
    [x,y,z] = cylinder(x,y);
    t1 = hgtransform;
    s1 = surf(3*x,3*y,4*z,'Parent',t1);
    grid on
    view(3)
    shading interp
end

2、matlab环境配置

首先检查自己的mcc编译器是否可用,输出以下命令:

复制代码
!mcc

若正常,出现以下结果:

其次在命令行输入以下内容:

复制代码
mbuild -setup

由于我们在C++环境下开发,故选择带C++的选项。

最后在命令行输入以下命令:

复制代码
mex -setup

同样选择带C++的选项。

3、打包dll

Qt调用dll

1、拷贝

将matlab生成for_redistribution_files_only文件夹下*.dll、*.h、*.lib文件拷贝到Qt项目目录下。

2、 在Qt下添加matlab相关库

复制代码
INCLUDEPATH += $$quote(D:/softWare/matlab/extern/include)
INCLUDEPATH += $$quote(D:/softWare/matlab/extern/include/win64)

INCLUDEPATH += $$quote(D:/softWare/matlab/extern/lib/win64/microsoft)
DEPENDPATH += $$quote(D:/softWare/matlab/extern/lib/win64/microsoft)
INCLUDEPATH += $$quote(D:/softWare/matlab/extern/lib/win64)
DEPENDPATH += $$quote(D:/softWare/matlab/extern/lib/win64)

win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibmx
win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibmat
win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibmex
win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibeng
win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -lmclmcr
win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -lmclmcrrt

注意:改写成自己安装matlab的位置,$$quote()当路径中有空格可正常引入。

3、添加matlab库

项目右击---添加库---外部库,选择matlab库文件。

添加成功后,会在pro文件中自动填入以下内容:

4、添加matlab头文件

项目右击---添加现有文件,选择上述拷贝到QT项目文件夹下的头文件。

5、QT调用

首先进行初始化,

复制代码
if(BDCubeInitialize())
    {
		qDebug() << "初始化成功!";
    }
	else
	{
		qDebug() << "初始化失败!";
	}

然后引入头文件,即可调用。

复制代码
#include "untitled4.h"

...
mwArray aa(1, 1, mxDOUBLE_CLASS, mxREAL);
mwArray bb(1, 1, mxDOUBLE_CLASS, mxREAL);
double a[1] = { 2 };
double b[1] = { 200 };
aa.SetData(a, 1);
bb.SetData(b, 1);
BDCube(aa, bb);

mwArray是C++向matlab传递i/o参数,matlab中的参数是矩阵表示的。mwArray aa(1, 1, mxDOUBLE_CLASS, mxREAL)代表是1*1的矩阵,即只有一个数据。

完整示例代码:

mainwindow.cpp

复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "BDCube.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    if(BDCubeInitialize())
    {
        qDebug() << "hhehe";
    }
    else
    {
        qDebug() << "ddhioeeh";
    }
	
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
	mwArray aa(1, 1, mxDOUBLE_CLASS, mxREAL);
	mwArray bb(1, 1, mxDOUBLE_CLASS, mxREAL);
	double a[1] = { 2 };
	double b[1] = { 200 };
	aa.SetData(a, 1);
	bb.SetData(b, 1);
    BDCube(aa, bb);
}

mainwindow.h

复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    

private:
    Ui::MainWindow *ui;

public slots:
	void on_pushButton_clicked();

};
#endif // MAINWINDOW_H

运行结果:

问题解决:

解决方法: 调试---窗口---异常设置,取消Win32 Exceptions勾选。

相关推荐
百锦再10 分钟前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame
Anson Jiang10 分钟前
浏览器标签页管理:使用chrome.tabs API实现新建、切换、抓取内容——Chrome插件开发从入门到精通系列教程06
开发语言·前端·javascript·chrome·ecmascript·chrome devtools·chrome插件
会开花的二叉树19 分钟前
继承与组合:C++面向对象的核心
java·开发语言·c++
长河2 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
Cyan_RA92 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
再见晴天*_*5 小时前
SpringBoot 中单独一个类中运行main方法报错:找不到或无法加载主类
java·开发语言·intellij idea
lqjun08277 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge8 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘9 小时前
39.网络流入门
开发语言·网络·c++·算法
未来之窗软件服务9 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟