Qt Creator c++调用Matlab生成的dll

本文介绍了如何使用Qt Creator调用由Matlab编译的C++共享库DLL。首先在Matlab中通过Library Compiler创建DLL,然后在Qt项目中添加所需的DLL、头文件和库文件,配置.pro文件,并实现调用接口。虽然最终成功运行,但遇到了首次运行按钮响应慢的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

m语言生成dll库

在Qt Creator中使用c++库

疑问


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

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值