目录
m语言生成dll库
1. 首先编写一个简单的m函数test.m并保存
% test.m
function ans = test(x,y)
ans = x + y;
end
2. 在matlab的命令行中输入deploytool并按回车键,选择"Library Compiler"。
deploytool
3. 第1红框中选择"C++ Shared Library"。第2红框中点击右边的加号,添加刚才编写好的test.m文件。第3红框中输入导出的库的名称。最后点击右上角的"Package",选择你要输出的路径。
4. 最后生成3个文件夹,我们之后要用到“for_redistribution_files_only”里的内容。
在Qt Creator中使用c++库
1. 新建一个Qt项目,项目名称为“XJLL_Qt”,其他保持默认。将“for_redistribution_files_only”文件夹内的“test_lib.dll”,"test_lib.h","test_lib.lib"这三个文件拷贝至Qt项目的根目录下:
2. 在Qt中右键你的项目框中,右键你的项目的根目录,选择“添加现有文件”。选择刚才拷贝过来的"test_lib.h"。
3. 在Qt中右键你的项目框中,右键你的项目的根目录,选择“添加库”,接着选择“外部库”。接着“库文件”选择刚才拷贝过来的“test_lib.lib”,平台只勾选“windows”,下面的都不要勾,然后点击“下一步”并完成添加。
4. 打开Qt项目的.pro文件,你会发现多了几行,说明已经成功添加进来了。
win32: LIBS += -L$$PWD/./ -ltest_lib
INCLUDEPATH += $$PWD/.
DEPENDPATH += $$PWD/.
接着在.pro文件中添加以下几行,其中的matlab路径改成你自己的,当然你也可以像上述操作一样,依次添加这几个库文件,我添加时为了方便,复制粘贴并修改了库名称。
INCLUDEPATH += 'D:/Program Files/MATLAB/R2018b/extern/include'
INCLUDEPATH += 'D:/Program Files/MATLAB/R2018b/extern/include/win64'
win32: LIBS += -L'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/' -llibmex
win32: LIBS += -L'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/' -llibmx
win32: LIBS += -L'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/' -llibmat
win32: LIBS += -L'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/' -llibeng
win32: LIBS += -L'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/' -lmclmcr
win32: LIBS += -L'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft/' -lmclmcrrt
INCLUDEPATH += 'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft'
DEPENDPATH += 'D:/Program Files/MATLAB/R2018b/extern/lib/win64/microsoft'
INCLUDEPATH += 'D:/Program Files/MATLAB/R2018b/extern/lib/win64'
DEPENDPATH += 'D:/Program Files/MATLAB/R2018b/extern/lib/win64'
注意每次.pro文件修改后,都要重新执行一遍qmake。(“构建”-->“qmake”)。
5. 简单设置"mainwindow.ui"的界面
6. 在“mainwindow.cpp”引入"test_lib.h"的头文件,“mainwindow.cpp”代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "test_lib.h" //引入头文件
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
if(!test_libInitialize()); //不执行test_libInitialize()会报错
mwArray aa(1,1,mxDOUBLE_CLASS,mxREAL);
mwArray bb(1,1,mxDOUBLE_CLASS,mxREAL);
mwArray cc(1,1,mxDOUBLE_CLASS,mxREAL);
double a[1]={ui->textEdit->toPlainText().toDouble()};
double b[1]={ui->textEdit_2->toPlainText().toDouble()};
double c[1];
aa.SetData(a,1);
bb.SetData(b,1);
test(1,cc,aa,bb);
cc.GetData(c,1);
ui->textEdit_3->setText(QString::number(c[0]));
}
7. 运行你的程序,注意,如果你的matlab是64位的,Qt在构建项目时也要选择64位,图示如下:
8. 最后的运行效果如下:
疑问
每次运行时,第一次点击按钮会等待较长时间,并且在Qt的“应用程序输出”中有如下输出,不清楚是什么原因。
SetThrowSegvLongjmpSEHFilter(): filter function installed
SetThrowSegvLongjmpSEHFilter(): filter function installed