• 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:Matlab2016bexterninclude
    库目录:G:Matlab2016bexternlibwin64microsoft

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

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

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

    第四步:重新打开VS2015的项目,将Matlab生成的四个文件放入该项目所在文件夹下。(注意:这就是关键所在,很多blog都没有说明的一点,这里的文件夹指的是Project1x64Debug目录下,这个目录下,testmat.dll、testmat.lib、testmat.ctf三个文件缺一不可,如果缺少ctf文件,编译不报错,初始化内存报错,而在Project1Project1目录下,需要保证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的提示,再调用就不出现了,不知道为什么,无解,百度不到答案。

  • 相关阅读:
    从jdbc到分层的飞跃
    第二章 变量和数据类型
    s1300新学期伊始的我们
    选择结构总结
    第四章 选择结构(二) Switch结构
    第三章 选择结构(一)
    第二章 变量、数据类型和运算符
    使用Java理解程序逻辑 第1章 初识Java 基本部分
    ES命令基础
    Spring MVC拦截器
  • 原文地址:https://www.cnblogs.com/zzzsj/p/14631016.html
Copyright © 2020-2023  润新知