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
    -matlab 編譯

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 目錄下。
    project

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

add_lib1
add_lib2
add_lib3

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 並且在編譯器都要選擇相同版本的。如果版本錯位,那麼結果就是程序還沒起來,然後就異常結束了,看的人是一臉懵逼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章