【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调用

mainwindow.h引入头文件,

#include "BDCube.h"

然后进行初始化,

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

最后进行调用即可。

...
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>


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>
#include "BDCube.h"


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勾选。

在Ubuntu系统中,将MATLAB生成DLL(动态链接)用于Qt应用程序通常需要以下几个步骤: 1. **安装依赖**: - 首先确保已经安装了MATLAB R20XX版本及其产生的 mex文件(.mexa64或.mexw64),因为Qt项目默认针对的是64位Linux。 - 安装libstdc++和libgcc-dev等开发工具包,这对于动态链接非常重要。 2. **MATLAB Mex文件**: - 使用MATLAB编写MEX函数,并通过`mex -setup`命令配置MATLAB与系统的链接路径,以便能找到所需的。 3. **构建MATLAB DLL**: - 编译MATLAB MEX函数生成DLL文件,确保它可以在Linux上运行。MATLAB可能会提供特定于平台的编译指南。 4. **复制到Qt目录**: - 将MATLAB生成DLL放到Qt项目的适当位置,比如`./lib`或`./plugins`目录下,这取决于您的应用如何组织插件。 5. **Qt中使用DLL**: - 在Qt中,可以通过QLibrary或QLibraryInfo加载DLL。例如: ```cpp QLibrary lib("path_to_your_dll"); void* func = lib.resolve("function_name"); // 函数名 if (func) { // 调用函数 (*reinterpret_cast<void(*)()>(func))(); } else { qCritical("Function not found in the library."); } ``` 或者在头文件中包含并在构造函数中加载: ```cpp class MyClass : public QObject { Q_OBJECT public: explicit MyClass(QLibrary *lib, QObject *parent = nullptr) : QObject(parent), myLib(lib) { if (!myLib.load("path_to_your_dll")) { qCritical("Failed to load MATLAB DLL."); } // 然后你可以像下面一样使用函数 myFunc(); } private slots: void myFunc() { void(*myFuncPointer)(); myFuncPointer = (void(*)())myLib.resolve("function_name"); if (myFuncPointer) { (*myFuncPointer)(); } } private: QLibrary *myLib; }; ``` 6. **处理错误**: - 当加载或调用DLL中的函数时,一定要注意异常处理,因为跨语言交互可能出现错误。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值