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混合编程细节总结_第1张图片


运行效果:(输入俩个数,点击计算,求和)

Qt与Matlab混合编程细节总结_第2张图片


总结:Qt与matlab混合编程,注意事项:软件版本匹配。Qt pro文件的书写。


补充一点,之前刷论坛看见一个问题说是  在Qt中使用mwArray时程序就会崩溃。出现这个问题,首先检查一下头文件包含是否正确,pro文件是否正确,都正确,那么就是在使用函数时,没有先调用初始化函数(看头文件就知道这个函数了),加上初始化,就OK了。

你可能感兴趣的:(Matlab,Qt)