Qt與Matlab混合編程細節總結

最近準備做一個項目,其中要用到很複雜的擬合算法等,自己去實現這些算法要很久,而手邊有師兄已經寫好的Matlab函數,如果可以實現利用Qt調用這些函數,那麼工作量將會減少很多。而且這個看上去也很簡單,至少博客文章上的貌似都很簡單。

經過了一天多的實踐,終於成功了!嘆曰:爲何別人那麼容易就實現了,到了自己就大費周折呢?

總結思路和這一天所遇到的問題和我解決的辦法如下:

思路:無非就是首先用matlab編寫.m文件(實現預期功能),然後將其生成Qt可調用的庫,然後用Qt調用這些庫。這裏是test所以.m文件很簡單,就是求兩個數的和。


軟件版本:win10 ,matlab 2015b,Qt 5.2.1, VS2012  //經過測試,這裏是VS2013 也沒問題


(生成動態庫時,高版本matlab和低版本的有所區別,一定要注意,我用的2015,方法大致同這篇文章     http://blog.csdn.net/sjhuangx/article/details/49305237)

遇到的問題1:

matlab生成C++ shared library失敗。嘗試的解決辦法:

matlab升級:之前我的版本是2010b,識別不了我的VS2012和VS2013,很鬱悶只能重裝一個2015版的matlab。

選擇不同的編譯器,未果,這裏只要matlab識別到了編譯器即可。

後來我發現,直接勾選第一個是沒問題的,生成的庫完全可以使用,所以這裏選第一個,問題解決!



使用剛生成的庫我就不多說了,用到的文件有.h頭文件,.lib文件和.dll文件。容我偷懶在貼一篇文章(http://blog.csdn.net/u012955739/article/details/74999408)

遇到的問題2:

缺少一系列的matlab頭文件。嘗試解決辦法:

這明顯示路徑包含沒對,但是我翻來覆去的看,INCLUDEPATH貌似沒問題啊,於是就採取笨方法將頭文件拷貝到工程目錄下,剛開始說好的只有一個,然後弄過來有出來一個,就是那種“子子孫孫無窮匱也”的感覺。這樣我沒堅持到2分鐘就不行了,直接告訴我弄完要死人!沒幫法回頭檢查pro文件吧。這下發現問題了,然後我就在心裏對Qt豎起了中指。

這是我之前的路徑,一般第一眼看,這能有什麼問題,不就是在include目錄下複製過來麼?對你沒看錯,我是複製過來的,但是Qt教導我們說,年輕人不能偷懶!!!

INCLUDEPATH += $$quote(G:\Program Files\MATLAB\R2015b\extern\include)
這是修改後的:

INCLUDEPATH += $$quote(G:/Program Files/MATLAB/R2015b/extern/include)

TAT,就是那個“斜杆”啊,吐血三升!


遇到的問題3:

在Qt中運行時出現:“libmx庫無法打開”之類的問題。嘗試的解決辦法:

這種問題一般是庫沒有被包含進來,路徑有問題等,這此我學乖了,斜杆保證沒打錯!!

之前是這樣的:

LIBS+=-L $$quote(G:/Program Files/MATLAB/R2015b/extern/lib/win32/microsoft) -llibmx

改後是這樣的:

LIBS+=-L$$quote(G:/Program Files/MATLAB/R2015b/extern/lib/win32/microsoft) -llibmx

哈哈,大Qt對格式要求就是嚴格,你不服麼?

在Qt中使用matlab中的函數和普通函數差不多,但是要了解一些mxArray。此次測試的代碼如下:

pro文件(,主要部分,這裏很重要哦)

INCLUDEPATH += $$quote(G:/Program Files/MATLAB/R2015b/extern/include)
INCLUDEPATH += $$quote(G:/Program Files/MATLAB/R2015b/extern/include/win32)

LIBS+=-L$$quote(G:/Program Files/MATLAB/R2015b/extern/lib/win32/microsoft) -llibmx
LIBS+=-L$$quote(G:/Program Files/MATLAB/R2015b/extern/lib/win32/microsoft) -llibmat
LIBS+=-L$$quote(G:/Program Files/MATLAB/R2015b/extern/lib/win32/microsoft)  -llibeng
LIBS+=-L$$quote(G:/Program Files/MATLAB/R2015b/extern/lib/win32/microsoft)  -lmclmcr
LIBS+=-L$$quote(G:/Program Files/MATLAB/R2015b/extern/lib/win32/microsoft)  -lmclmcrrt
LIBS+=-L$$quote(C:/Users/Y-305/Desktop/matlab/Add/for_testing) -lAdd


win32:CONFIG(release, debug|release): LIBS += -L$$PWD/C:/Users/Y-305/Desktop/matlab/Add/for_testing/ -lAdd
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/C:/Users/Y-305/Desktop/matlab/Add/for_testing/ -lAdd
else:unix: LIBS += -L$$PWD/C:/Users/Y-305/Desktop/matlab/Add/for_testing/ -lAdd

INCLUDEPATH += $$PWD/C:/Users/Y-305/Desktop/matlab/Add/for_testing
DEPENDPATH += $$PWD/C:/Users/Y-305/Desktop/matlab/Add/for_testing

MainWindow.cpp(還是上圖吧,方便~~)



運行效果:(輸入倆個數,點擊計算,求和)



總結:Qt與matlab混合編程,注意事項:軟件版本匹配。Qt pro文件的書寫。


補充一點,之前刷論壇看見一個問題說是  在Qt中使用mwArray時程序就會崩潰。出現這個問題,首先檢查一下頭文件包含是否正確,pro文件是否正確,都正確,那麼就是在使用函數時,沒有先調用初始化函數(看頭文件就知道這個函數了),加上初始化,就OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章