通过类比在VS2010中调用Matlab dll文件,实现在Qt Creator中调用Matlab Dll文件

来源:互联网 发布:logback.xml不打印sql 编辑:程序博客网 时间:2024/05/01 23:24

记录使用Qt Creator调用Matlab的dll文件

先安装VS2010旗舰版,再安装Qt SDK,这样Qt SDK会自动检测编译器,就可以使用和VS2010一样的编译器了是MSVC2010。那么也就是说在VS2010上成功调用了Matlab的dll文件,在Qt Creator上也一样可以。
安装Matlab 2011b 32位的版本,要保持Qt VS Matlab的位数一致。
首先,根据网上的资料博客操作VS2010和Matlab的混合编程,具体步骤如下:
1. 编写示例文件 MyAdd.m
   function [c] = MyAdd(x,y)
       c=x+y;
   end
2.设置MATLAB的编译环境:
在MATLAB命令窗口中输入 mex -setup,选择Microsoft Visual C++ 2010,完成之后再输入mbuild -setup,同样选择Microsoft Visual C++ 2010。
3.编译MyAdd.m文件:
输入mcc -W cpplib:MyAdd -T link:lib MyAdd.m
4.用VS2010新建工程,并配置工程:
4.1新建C++空项目,选择Release版本,点击Win32栏的下三角,选择配置管理器,在活动方案解决平台那选择新建,在键入或选择新平台那里选择x64。
4.2配置工程属性:
C/C++ ->常规->附加包含目录添加为MATLAB的附加包含目录:C:\Program Files\MATLAB\R2011b\extern\include
链接器->常规->附加库目录添加为C:\Program Files\MATLAB\R2011b\extern\lib\win32\microsoft
链接器->输入->附加依赖项添加五个文件:mclmcrrt.lib、mclmcr.lib、libmx.lib、libmat.lib、MyAdd.lib
4.3编辑C++测试文件MyAdd

#include <iostream>

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "MyAdd.h"

 

using namespace std;

 

int main()

{

if(!MyAddInitialize())

{

       cout<<"Couldnot initialize lib:myadd!"<<endl;

       exit(0);

}

   mwArraya(1,1,mxDOUBLE_CLASS); 

   mwArrayb(1,1,mxDOUBLE_CLASS); 

   a(1,1)=20; 

   b(1,1)=30; 

   mwArray x(1,1,mxDOUBLE_CLASS); 

   mwArray y(1,1,mxDOUBLE_CLASS); 

   MyAdd(2,x,y,a,b);   

  double *i=new double; 

   double *j=new double; 

   x.GetData(i,1); 

   y.GetData(j,1);

  cout<<"x="<<*i<<" y="<<*j<<endl;

   getchar(); 

   return0; 

}


4.4将Matlab生成的MyAdd.h  MyAdd.lib 拷贝到源码所在目录: C:\Projects\testMatlab\testMatlab
将MyAdd.dll拷贝到 C:\Projects\testMatlab\x64\Release

4.5点击生成解决方案,程序会提示缺少mclmcr.dll文件,从x64\Release目录中拷贝MyAdd.exe文件和MyAdd.dll文件到C:\Program Files\MATLAB\R2011b\include\bin\win64,这时点击MyAdd.exe就会成功执行了。

                                           上面的是VS2010调用matlab,下面使用Qt 调用matlab

准备环境:Win7:  32位      Qt:  Qt  5.5.1  Matlab版本:MATLAB  R2013a
1.设置MATLAB的编译器:输入mbuild -setup,选择Microsoft Visual C++ 2010。
2.新建一个Matlab测试函数,选择New->Function,测试文件是test.m
   function y = test()
      x = 0:0.01:25;
      y = -x.^2 + 4*x +450;
      plot(x,y,'LineWidth',2);
   end
点击Run之后显示出结果。
3.将Matlab的当前工作路径切换到test.m所在的文件夹,输入:mcc -W lib:testdll -T link:lib test.m
4.编译成功后会出现testdll.dll、testdll.lib、testdll.h等文件
5.新建Qt工程,编译空工程test。选择Application->Qt Widgets Application->名称test->基类选择QMainWindow
6.隐式调用法:将生成的testdll.h和testdll.lib拷贝到test工程文件夹下,将testdll.h拷贝到debug文件夹下。
7.配置Qt工程:将testdll.lib加入进来,将testdll.h加入到工程里面:
添加现有文件,将testdll.h加进来
修改pro文件
DEFINES  += __LCC__(注意这里是长下划线,是两个下划线连在一起)

#添加路径
#头文件路径
(注意:文件夹名字不能有空格,也就是路径不能有空格。如这样就不行C:\Program Files就不行)
INCLUDEPATH   +=  D:\SpecialSoftWare\Matlab2013a\extern\include
INCLUDEPATH   +=  D:\SpecialSoftWare\Matlab2013a\extern\include/win32

#添加库
L后面是库路径,l后面是库
LIBS  += -L./debug -ltestdll
LIBS  += -LD:\SpecialSoftWare\Matlab2013a\extern\lib\win32\microsoft -llibmx

需要在ui界面上添加两个按钮
对应mainwindow.cpp内容为:
#include “testdll.h"
#include <mclmcrrt.h>
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent):
          QMainWindow(parent),
          ui(new Ui::MainWindow)
{
          ui->setupUi(this);
}

MainWindow::~MainWindow()
{
          delete ui;
}

void MainWindow::on_pushButton_clicked()
{
        if(testdllInitialize())
        {
              QMessageBox::information(NULL,"Ok","init is ok");
        }
        else
        {
              QMessageBox::information(NULL,"No","init is failed");
        }
      mlfTest(1,NULL);//调用功能函数
}

void MainWindow::on_pushButton_2_clicked()
{
       testdllTerminate()://结束Dll库
}




0 0
原创粉丝点击