通過類比在VS2010中調用Matlab dll文件,實現在Qt Creator中調用Matlab Dll文件

記錄使用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庫
}




發佈了15 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章