记录使用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
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "MyAdd.h"
using namespace std;
int main()
{
if(!MyAddInitialize())
{
cout<<"Couldnot initialize lib:myadd!"<
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<
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
#include
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库
}