Qt 与 Matlab 混合编程

Qt与 Matlab 混合编程在网上可以找到资料,自己找了很多资料后才把环境搭建好,还是总结一下方便以后使用。

  • Matlab 编译 C++ 库
  • Qt 调用 Matlab 库
  • 注意事项

环境搭建

  • Windows 10 企业版
  • Matlab2019b-64bit
  • Qt Creator 4.11.1
  • Qt 版本:Qt 5.14.1 (MSVC 2017, 32 bit)
  • 编译器:Qt 5.13.2 MSVC2017 64bit

Matlab 编译 C++ 库

在编译 C++ 库时首先需要准备好 xxx.m 文件,如截图中。

  • 选择编译器:mbuild -setup
  • 编译命令:mcc -W cpplib:derivative -T link:lib derivative
编译 C++ 库

Qt 调用 Matlab 库

在调用 Matlab 库之前首先确定电脑已经安装了 Matlab,有的需要安装 MCRInstaller,MCRInstaller 是 Matlab 库。在本次安装的 Matlab2019b 是完全版本,需要找到 Matlab 安装目录,并且引用到 Qt 中。

Qt 工程文件中引用 Matlab 库


1
2
3
4
5
6
// xxx.pro
#Matlab
INCLUDEPATH += D:/R2019b/extern/include
LIBS += -LD:/R2019b/extern/lib/win64/microsoft -lmclmcr
LIBS += -LD:/R2019b/extern/lib/win64/microsoft -lmclmcrrt
LIBS += -LD:/R2019b/extern/lib/win64/microsoft -llibmx

注意:

  • 如果还程序中还需要使用其他的库,再引用其他库即可。
  • “D:/R2019b” 是本机 Matlab 安装路径。
  • 将 “\” 改为 “/”。
  • 如果目录有空格,使用 $$quote()。

Qt 工程目录结构

  • 在 Qt 工程目录下创建 include 和 lib 目录。
  • 将 Matlab 编译生成的 xxx.h 文件放在 include 目录下;将编译生成的 xxx.lib 和 xxx.dll 文件放在 lib 目录下。
库目录

Qt 引用 Matlab 编译的库

  • 右击工程–>添加库–>外部库–>库文件(浏览)–>选择要加入的库。
  • 通常 Qt 将自动添加 include 目录,如果没有就自己选择。
  • 添加完成后 Qt 将在 xxx.pro 工程文件中完成库引用。

1
2
3
4
5
6
// xxx.pro
win32: LIBS += -L$$PWD/lib/ -ladd
win32: LIBS += -L$$PWD/lib/ -lderivative

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

Qt 编译器选择

由于 Matlab 版本为 64 位,并且选择编译器时也是使用了 Microsoft Visual C++ 2017 (C),在选择 Qt 编译器时选择 MSVC2017 64bit。

使用库

  • 添加头文件
  • 初始化库
  • 调用库函数
  • 结束库

1
2
3
// 添加头文件
#include "add.h"
#include "derivative.h"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 使用
if(!derivativeInitialize()) { // 初始化,必须要使用
    qDebug() << "add init failed.";
    return;
}
uint count = 500;
double *a = new double[count];
for (uint i = 0; i < count; i++) {
    a[i] = i;
}
mwArray Y;
mwArray T(1, count, mxDOUBLE_CLASS);
mwArray V(1, count, mxDOUBLE_CLASS);
V.SetData(a, count);
derivative(1, Y, T, V); // 调用库函数
qDebug() << Y.ToString();
size_t Row = Y.NumberOfDimensions();
size_t Col = Y.NumberOfElements();
for (size_t i = 1; i < Row; i++) {
    for (size_t j = 1; j <= Col; j++) {
        double x = Y.Get(i, j);
        qDebug() << x;
    }
}
delete [] a;
a = nullptr;
derivativeTerminate(); // 结束库

注意事项

  • Qt 引用 Matlab 库的目录时如果目录中存在空格,使用 $$quote() 来包含目录。
  • 目录中使用通用 “/”,而不是使用 “\” 或者 “\\”,后者只是 Windows 上用,“/” 才是通用的。
  • 如果安装的 Matlab 是 64 位的,那么也需要使用 Qt 也需要使用 64 位的,这里说的版本一致是指 64 位 Matlab 并且在编译器都要选择相同版本的。如果版本错位,那么结果就是程序还没起来,然后就异常结束了,看的人是一脸懵逼。

发表评论

电子邮件地址不会被公开。 必填项已用*标注