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
-
Qt 调用 Matlab 库
在调用 Matlab 库之前首先确定电脑已经安装了 Matlab,有的需要安装 MCRInstaller,MCRInstaller 是 Matlab 库。在本次安装的 Matlab2019b 是完全版本,需要找到 Matlab 安装目录,并且引用到 Qt 中。
Qt 工程文件中引用 Matlab 库
// 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 工程文件中完成库引用
// 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 ©,在选择 Qt 编译器时选择 MSVC2017 64bit。
使用库
- 添加头文件
- 初始化库
- 调用库函数
- 结束库
// 添加头文件
#include "add.h"
#include "derivative.h"
// 使用
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 并且在编译器都要选择相同版本的。如果版本错位,那么结果就是程序还没起来,然后就异常结束了,看的人是一脸懵逼。