如何用Qt调用matlab生成的动态库?急急急!!!

shakhka 发布于 2016/01/12 15:22
阅读 2K+
收藏 0

我的环境:64win8Qt5.5.1(x86-mingw492)matlabR2014aVS2013

 

我想要实现的功能:将目前用matlab写好的程序在matlab下编译生成dlllibh等文件,采用Qt调用这些文件,达到调用matlab程序实现其功能的目的!

 

网上有类似的例子,可是我按着做就是编译不过去!!可能我全是64位的,例子是32位的???

 

例子http://blog.sina.com.cn/s/blog_4dc31b560100qqcw.html

 

就先用例子给的matlab示例试验一下

 

function b = myFunc(a)

%MYFUNC Summary of this function goes here

%   Detailed explanation goes here

b=a.*a;

end

以下是我的matlab生成dll等文件的操作

 

(先在命令行窗口输入mex -setup然后选择编译器 mex -setup C++,再输入mbuild -setup,然后选择mex -setup C++ -client MBUILD ,最后用mcc -W cpplib:libmyFunc -T link:lib myFunc命令生成dll等文件)

 

>> mex -setup

MEX 配置为使用 'Microsoft Visual C++ 2013 Professional (C)' 以进行 C 语言编译。

Warning: The MATLAB C and Fortran API has changed to support MATLAB

variables with more than 2^32-1 elements. In the near future

you will be required to update your code to utilize the

new API. You can find more information about this at:

http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.

 

 

要选择不同的语言,请从以下选项中选择一种命令:

 mex -setup C++ 

 mex -setup FORTRAN

MEX 配置为使用 'Microsoft Visual C++ 2013 Professional' 以进行 C++ 语言编译。

Warning: The MATLAB C and Fortran API has changed to support MATLAB

variables with more than 2^32-1 elements. In the near future

you will be required to update your code to utilize the

new API. You can find more information about this at:

http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.

>> mbuild -setup

MBUILD 配置为使用 'Microsoft Visual C++ 2013 Professional (C)' 以进行 C 语言编译。

 

 

要选择不同的语言,请从以下选项中选择一种命令:

 mex -setup C++ -client MBUILD 

 mex -setup FORTRAN -client MBUILD

MBUILD 配置为使用 'Microsoft Visual C++ 2013 Professional' 以进行 C++ 语言编译。

>> mcc -W cpplib:libmyFunc -T link:lib myFunc

使用 'Microsoft Visual C++ 2013 Professional' 编译。 

MEX 已成功完成。 

 

然后在qt中新建工程项目,名untitled9,然后按照例子一步一步做,该修改的修改,以下是我的.pro文件

 

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

#

# Project created by QtCreator 2016-01-12T13:27:48

#

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

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

 

TARGET = untitled9

TEMPLATE = app

SOURCES += main.cpp\

 mainwindow.cpp

HEADERS += mainwindow.h \

libmyFunc.h

FORMS += mainwindow.ui

OTHER_FILES += \

libmyFunc.lib \

libmyFunc.dll \

INCLUDEPATH += D:/MATLAB/R2014a/extern/include

INCLUDEPATH += D:/MATLAB/R2014a/extern/include/win64

LIBS+=-L D:/MATLAB/R2014a/extern/lib/win64/microsoft -llibmx

LIBS+=-L D:/MATLAB/R2014a/extern/lib/win64/microsoft -lmclmcr

LIBS+=-L D:/MATLAB/R2014a/extern/lib/win64/microsoft -lmclmcrrt

以下是我的.cpp文件

 

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <mclmcrrt.h>

#include <mclcppclass.h>

#include <QMessageBox>

#include <QLibrary>

#include <QMetaType>

#include <QDebug>

#include "libmyFunc.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("libmyFunc.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!");

}

运行报错如下:

 

查看了一下第一个错误:


 

追踪了一下:


 

这个mclmcr.hmatlabD:\MATLAB\R2014a\extern\include里面提供的头文件,就卡在这里,往下不知道该怎么改了!急求大神高手帮帮忙!~~任务紧急,老板催着呢。。。谢谢好心人!!

加载中
0
xpbob
xpbob
今天这么多类似的问题……,应该是平台识别成功了,但是头文件没有引入,你去找你最后一张图里有相应的头文件吗,话说你知道平台吧,例如第一个是linux系统,第二是苹果系统,第三个是sun的系统,第四个是hp,msc应该是微软,你能在头文件里找到int64_t那就引入那个头文件,要是没有,赌一把,你加入下面这句话在mclmcr.h  typedef long int int64_t;这里的声明就表示和Linux一样了。


玉米彭
玉米彭
回复 @shakhka : 解决了吗
xpbob
xpbob
@shakhka 我记得qt也是gcc编译器,所以考虑让声明和linux相同,估计没问题
s
shakhka
好的好的我试试 谢谢你啊!
0
x
xyzeng

你好,请问你的问题解决了么?

你在32位系统下是否有调通呢?

0
云鹤起舞
云鹤起舞

由于qt的编译器mingw是满足GNUC标准的,但是该头文件中将满足GNUC的编译器内置在

#  elif defined( macintosh ) || defined( __APPLE__ ) || defined( __APPLE_CC__ )之内,因此找不到mxInt64对应的声明了,可以将头文件中这一段修改一下即可:

#if !defined(__MW_STDINT_H__)
# if defined( linux ) || defined( __linux ) || defined( __linux__ )
# include <stdint.h>
 typedef int64_t mxInt64;
 typedef uint64_t mxUint64;
# elif defined( macintosh ) || defined( __APPLE__ ) || defined( __APPLE_CC__ )
# elif defined( __GNUC__ )
# include <stdint.h>
 typedef int64_t mxInt64;
 typedef uint64_t mxUint64;
0
SVD
SVD
请问楼主后来问题解决了吗
0
a小鱼儿a
a小鱼儿a
不要用qt自带的编译器
0
a小鱼儿a
a小鱼儿a
用vs上的qt组件调用,我就是这样做的,qt自带的编译器对于MATLAB里面的一些函数认可不了
返回顶部
顶部