QT/VS -- 调用matlab的dll文件

Matlab生成dll等文件的步骤之前文章里有,下边写一下VS调用MATLAB生成的dll的方法。(QT调用方法一样)

https://www.cnblogs.com/zzzsj/p/14630559.html

C++部分:
创建工程文件,注意:测试环境使用的是64位操作系统,因此务必在x64环境下进行以下配置。(这是与你的matlab版本匹配的,我的matlab安装的是64bit的)

第一步:VC++目录
假设Matlab安装目录为G:\Matlab2016b,这个根据本机安装目录自行调整。

包含目录:G:\Matlab2016b\extern\include
库目录:G:\Matlab2016b\extern\lib\win64\microsoft

第二步:链接器->输入->附加依赖项,添加以下库(都是matlab里的库)
mclmcrrt.lib
libmat.lib
libmx.lib
mclmcr.lib(这个lib缺少经测试也是可以的,但还是先加上吧)

第三步:配置系统变量
“我的电脑”右键,打开“属性”;选择“高级系统设置”;找到系统属性页面的“高级”选项,右下方“环境变量”;页面中下方是系统变量,将Path设置为G:\Matlab2016b\bin\win64

进行完以上配置后,将电脑进行重启(让环境变量生效)。

第四步:重新打开VS2015的项目,将Matlab生成的四个文件放入该项目所在文件夹下。(注意:这就是关键所在,很多blog都没有说明的一点,这里的文件夹指的是Project1\x64\Debug目录下,这个目录下,testmat.dll、testmat.lib、testmat.ctf三个文件缺一不可,如果缺少ctf文件,编译不报错,初始化内存报错,而在Project1\Project1目录下,需要保证testmat.dll、testmat.lib、testmat.h这3个文件)。

第五步:调试–>窗口–>异常设置–>Win32 Exceptions全部不要勾选。

至此完成VS的配置。

下边是测试代码:(我用QT写的,用法一样,凑合看)

void MainWindow::on_pushButton_clicked()
{

    if( !testmatInitialize() )  //testmatInitialize()Matlab自动生成的初始化函数,调用函数之前必须先初始化
    {
        qDebug()<<"fail2";
    }
    qDebug()<<"success";

    mwArray aa(1,1,mxDOUBLE_CLASS,mxREAL);
    mwArray bb(1,1,mxDOUBLE_CLASS,mxREAL);
    mwArray cc(1,1,mxDOUBLE_CLASS,mxREAL);

    double a[1]={12};
    double b[1]={5};
    double c[1];

    aa.SetData(a,1);
    bb.SetData(b,1);
    testmat(1,cc,aa,bb);   //目标函数
    cc.GetData(c,1);
    ui->label->setText(QString::number(c[0]));
}

运行结果:

ps:一个小问题,在主界面上第一次调用函数时,程序输出栏里会出现SetThrowSegvLongjmpSEHFilter(): filter function installed的提示,再调用就不出现了,不知道为什么,无解,百度不到答案。

 

posted @ 2021-04-08 10:21  手磨咖啡  阅读(1869)  评论(0编辑  收藏  举报