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 並且在編譯器都要選擇相同版本的。如果版本錯位,那麼結果就是程序還沒起來,然後就異常結束了,看的人是一臉懵逼。