最近准备做一个项目,其中要用到很复杂的拟合算法等,自己去实现这些算法要很久,而手边有师兄已经写好的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了。