在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近准备做一个项目,其中要用到很复杂的拟合算法等,自己去实现这些算法要很久,而手边有师兄已经写好的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了。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论