加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

QT Creator与Matlab混合编程

(2011-03-30 22:15:06)
标签:

qt

creator

matlab

dll

it

分类: VC
经过好多次试验,终于在qt creator环境下成功调用matlab环境下编译的dll,步骤如下。本人的实验环境为:
  • win 7操作系统
  • matlab 2009b
  • QT Creator 2.0.1
  1. 首先在matlab环境下编译生成dll
本人用的测试函数为:
function b = myFunc(a)
%MYFUNC Summary of this function goes here
%   Detailed explanation goes here
b=a.*a;
end

首先设置编译器,关于编译器的设置在我的一篇博文中《VS 2008 环境下调用matlab生成的dll》已做阐述,在这里我们选择matlab自带的lcc编译器。

在命令行窗口输入一下命令:
mcc -t -W libhg:myfuncdll -T link:lib -h libmmfile.mlib myFunc.m
编译完成后生成myfuncdll.dll、myfuncdll.h、myfuncdll.lib等文件

可以用VC++ 6.0的depends查看工具查看生成的dll文件的export函数,如下图所示:
http://s15/bmiddle/4dc31b56n9fb45889ea5e&690Creator与Matlab混合编程" TITLE="QT Creator与Matlab混合编程" />

2.在qt creator中显式调用dll文件
  首先确定系统的环境变量中有以下几个变量:
  D:\Software\Matlab2009\R2009b\runtime\win32
  D:\Qt\2010.05\bin;
  D:\Qt\2010.05\qt\bin;
  D:\Qt\2010.05\mingw\bin;
  其中目录根据自己的安装路径所定
  
  建立一个Qt Gui Application应用,本实验取名为qttest,将刚才生成的myfuncdll.h、myfuncdll.lib拷贝至工程的qttest文件夹下,将myfuncdll.dll文件拷至运行后的debug文件夹下。

修改工程的pro文件,修改后内容如下:
#-------------------------------------------------

#

# Project created by QtCreator 2011-03-29T17:08:47

#

#-------------------------------------------------


QT       += core gui


TARGET = qttest

TEMPLATE = app



SOURCES += main.cpp\

        mainwindow.cpp


HEADERS  += mainwindow.h \

    libmyadd2.h \

    myfuncdll.h


FORMS    += mainwindow.ui


OTHER_FILES += \

    libmyadd2.lib \

    libmyadd2.dll \

    myfuncdll.lib \

    myfuncdll.dll


INCLUDEPATH += D:/Software/Matlab2009/R2009b/extern/include


INCLUDEPATH += D:/Software/Matlab2009/R2009b/extern/include/win32



LIBS+=-L D:/Software/Matlab2009/R2009b/extern/lib/win32/microsoft -llibmx

LIBS+=-L D:/Software/Matlab2009/R2009b/extern/lib/win32/microsoft -lmclmcr

LIBS+=-L D:/Software/Matlab2009/R2009b/extern/lib/win32/microsoft -lmclmcrrt



在mainwindowui上添加一个按钮,取名为显示,如下图所示:

http://s9/middle/4dc31b56n9fb429ddbaf8&690Creator与Matlab混合编程"  TITLE="QT Creator与Matlab混合编程" />


然后进入显示按钮的clicked()槽函数,编辑完成后的mainwindow.cpp文件为:

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <mclmcrrt.h>

#include <mclcppclass.h>

#include <QMessageBox>

#include <QLibrary>

#include <QMetaType>

#include <QDebug>

#include "myfuncdll.h"


MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

}


MainWindow::~MainWindow()

{

    delete ui;

}

typedef bool MW_CALL_CONV(*Fun)(int,mxArray**,mxArray*); //定义函数指针,以备调用

typedef bool MW_CALL_CONV(*Fun2)(void);

typedef bool MW_CALL_CONV(*Fun3)(void);

void MainWindow::on_pushButton_clicked()

{

    QLibrary lib("myfuncdll.dll");

    QMessageBox msg;

    if(lib.load())

    {

       QMessageBox::information(NULL,"OK","DLL load is OK!");

       Fun open=(Fun)lib.resolve("_mlfMyFunc"); //援引 _mlfMyFunc() 函数

       Fun2 init=(Fun2)lib.resolve("_myfuncdllInitialize");//援引 _myfuncdllInitialize() 函数

       Fun2 termi=(Fun3)lib.resolve("_myfuncdllTerminate");//援引 _myfuncdllTerminate() 函数

       if (open)                  //是否成功连接上 add() 函数

       {

           QMessageBox::information(NULL,"OK","Link to Function is OK!");

           init();  //库初始化

           double _x[5] = {1, 2, 3, 4, 5};  //输入数组

           double _y[5]; //输出数组

           mxArray* x = mxCreateDoubleMatrix(1, 5, mxREAL);//创建1*5矩阵

           memcpy(mxGetPr(x), (void*)_x, sizeof(_x));  //拷贝输入数据


           mxArray* y = mxCreateDoubleMatrix(1, 5, mxREAL);//创建1*5矩阵

           open(1,&y,x);

           memcpy(_y, mxGetPr(y), sizeof(_y));//拷贝输出数据

           QString song=QString::number(_y[1]);

           QMessageBox::information(NULL,"OK",song);

           termi();//结束DLL库

}

       else

           QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");

    }

    else

         QMessageBox::information(NULL,"NO","DLL is not loaded!");

}




3.运行结果:

http://s3/bmiddle/4dc31b56n9fb43d859142&690Creator与Matlab混合编程"  TITLE="QT Creator与Matlab混合编程" />




http://s10/middle/4dc31b56n9fb4419bcac9&690Creator与Matlab混合编程" TITLE="QT Creator与Matlab混合编程" />




http://s2/middle/4dc31b56n9fb442ac2d51&690Creator与Matlab混合编程"  TITLE="QT Creator与Matlab混合编程" />

http://s3/middle/4dc31b56n9fb446ed7232&690Creator与Matlab混合编程" TITLE="QT Creator与Matlab混合编程" />

注:在matlab环境中编译生成的头文件中的导出函数名字与在depends查看器中的名字不同,depends查看器中显示为_xxx,即在原有的函数前加了一个下划线,不知为什么,希望知道原理的高人给予指点。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有