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