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