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


    matlab生成dll库

    1、matlab示例代码

    1. function BDCube(x,y)
    2. [x,y,z] = cylinder(x,y);
    3. t1 = hgtransform;
    4. s1 = surf(3*x,3*y,4*z,'Parent',t1);
    5. grid on
    6. view(3)
    7. shading interp
    8. 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相关库

    1. INCLUDEPATH += $$quote(D:/softWare/matlab/extern/include)
    2. INCLUDEPATH += $$quote(D:/softWare/matlab/extern/include/win64)
    3. INCLUDEPATH += $$quote(D:/softWare/matlab/extern/lib/win64/microsoft)
    4. DEPENDPATH += $$quote(D:/softWare/matlab/extern/lib/win64/microsoft)
    5. INCLUDEPATH += $$quote(D:/softWare/matlab/extern/lib/win64)
    6. DEPENDPATH += $$quote(D:/softWare/matlab/extern/lib/win64)
    7. win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibmx
    8. win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibmat
    9. win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibmex
    10. win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -llibeng
    11. win32: LIBS += -L$$quote(D:/softWare/matlab/extern/lib/win64/microsoft) -lmclmcr
    12. 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"

    然后进行初始化,

    1. if(BDCubeInitialize())
    2. {
    3. qDebug() << "初始化成功!";
    4. }
    5. else
    6. {
    7. qDebug() << "初始化失败!";
    8. }

    最后进行调用即可。

    1. ...
    2. mwArray aa(1, 1, mxDOUBLE_CLASS, mxREAL);
    3. mwArray bb(1, 1, mxDOUBLE_CLASS, mxREAL);
    4. double a[1] = { 2 };
    5. double b[1] = { 200 };
    6. aa.SetData(a, 1);
    7. bb.SetData(b, 1);
    8. BDCube(aa, bb);

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

    完整示例代码

    mainwindow.cpp

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include <QDebug>
    4. MainWindow::MainWindow(QWidget *parent)
    5. : QMainWindow(parent)
    6. , ui(new Ui::MainWindow)
    7. {
    8. ui->setupUi(this);
    9. if(BDCubeInitialize())
    10. {
    11. qDebug() << "hhehe";
    12. }
    13. else
    14. {
    15. qDebug() << "ddhioeeh";
    16. }
    17. }
    18. MainWindow::~MainWindow()
    19. {
    20. delete ui;
    21. }
    22. void MainWindow::on_pushButton_clicked()
    23. {
    24. mwArray aa(1, 1, mxDOUBLE_CLASS, mxREAL);
    25. mwArray bb(1, 1, mxDOUBLE_CLASS, mxREAL);
    26. double a[1] = { 2 };
    27. double b[1] = { 200 };
    28. aa.SetData(a, 1);
    29. bb.SetData(b, 1);
    30. BDCube(aa, bb);
    31. }

    mainwindow.h

    1. #ifndef MAINWINDOW_H
    2. #define MAINWINDOW_H
    3. #include
    4. #include "BDCube.h"
    5. QT_BEGIN_NAMESPACE
    6. namespace Ui { class MainWindow; }
    7. QT_END_NAMESPACE
    8. class MainWindow : public QMainWindow
    9. {
    10. Q_OBJECT
    11. public:
    12. MainWindow(QWidget *parent = nullptr);
    13. ~MainWindow();
    14. private:
    15. Ui::MainWindow *ui;
    16. public slots:
    17. void on_pushButton_clicked();
    18. };
    19. #endif // MAINWINDOW_H

    运行结果:

    问题解决:

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

  • 相关阅读:
    手写Promise
    R语言数据类型转换:基本数据类型的转换、将一种数据类型转化为另外一种数据类型
    Python自动处理pptx:新建、另存、添加幻灯片、添加标题、插入文本图片图形、提取文本
    Python面试题_第 (4) 章
    QT环境配置
    Linux常用命令
    马蹄集oj赛(双周赛第十五次)
    java某百货店POS积分管理系统积分点更新生成以及通票回收处理源代码+LW
    小红书发布2022年美妆用户洞察报告,近八成用户选它
    React框架下如何集成H.265网页流媒体视频播放器EasyPlayer.js?
  • 原文地址:https://blog.csdn.net/WXG1011/article/details/132885646