VisualStudio配置与Matlab混合编译问题总结
写这篇博客记录一下自己在配置过程中遇到的种种问题,也做一个小小总结,试图把整个过程讲明白,希望对面临同样问题的人有所帮助。网上此类教程很多,最好是能有个引导,出现什么问题应该看什么,怎么看。
一.适用情况
个人是编写C++程序中(MFC程序)需要用到Matlab用于绘图和Matlab中的一些计算操作,因此通过如下引擎调用Matlab。配置版本为VS2022与Matlab2017a。
#include "engine.h"
二.过程中遇到的问题-Matlab
1.版本不适配
如何看自己的matlab是否支持VS版本?
参考这位博主:(3条消息) 低版本Matlab(2020b)与高版本Visual Studio(VS2022)实现M、C/C++混合编程(调试)_matlab与vs混合编程_读书人不偷东西的噢!的博客-CSDN博客
我遇到的问题主要是低版本的matlab不支持高版本的VS,因此需要进行配置版本文件的修改。
在matlab的Command Window中输入
mex -setup
在输入命令后,Matlab询问选择时选C++,完成matlab编译器设置,自此Matlab问题解决。
(其实Matlab是没怎么遇到问题的,主要还是VS)
三.过程中遇到的问题-VisualStudio
1.项目属性修改
打开项目-属性,进行属性配置,主要是添加一些Matlab环境以便混合编译。
这里附上我的属性配置(不同的版本和安装时的设置,可能会导致路径上有细微差别,我记得我配置时大体上是可以对上的)。
要注意的是,无法正常运行也有可能是预处理器定义这里出现问题,比如是console程序还是windows等等,需要分清。以及程序到底是用的win32还是x64也要知道,不然也许会出错。
重启生效,预备工作做完,具体不赘述。
2.遇到的问题
诸如此类,这是表明需要的动态链接库找不到(还有icuio44.dll、icudt44.dll等等)。
最开始想到的是缺什么库就补什么,直接在网站上对应下载,然后装进matlab对应的dll所在的路径。注意,网上内容质量参差不齐,最好自己记录下都安了什么进去,别稀里糊涂到最后想删都不知道删哪个。
对应的应该是XXXX/Matlab2017a/bin/win64(以我的举例)
题外话:这里注意,有很多教程直接说装在系统文件夹下,如
WIndows/System32文件夹对应64位的dll文件
sysWOW64文件夹对应32位的dll文件等等。
个人觉得是很容易弄错的,而且网上资料繁杂,也很难说你下载的到底是32位还是64位的dll。(如果不得已要试试这种方法:详见这位大佬(3条消息) 如何判断一个dll/exe是32位还是64位?(两种方法)_怎么知道dll是32位_c#上位机的博客-CSDN博客)
这里是不推荐的,因为系统里的东西其实还是最好不要动,牵涉广泛,没准哪天用别的东西,就因为你系统文件夹里东西删删减减而用不了了,又要解决新问题,多一事不如少一事。
接着上面讲:
如果还不行,尝试这位博主的:
(3条消息) 提示找不到libmat.dll文件的解决方法_LeonSUST的博客-CSDN博客
添加系统的环境变量,进行尝试。
对于我个人的情况,是没有用这一步的。安装上对应的库之后,情况变成了
应用程序无法正常启动(0xc000007b)
很明显上面的问题是治标不治本的,还是dll的依赖没有处理好,处理到现在也很焦头烂额了。也尝试了用directX修复,强力修复等等,不建议一开始使用修复,很大程度上不是修复的问题,而是库的调用上没有处理好。
四.如何定位混合编译中VisualStudio出现的问题
建议,如果是有可以编译运行的程序而不是直接是可执行文件exe的话试着编译一下,参看:
(3条消息) VS(Visual Studio)应用程序无法正常启动(0xc000007b)解决办法大全_vs打不开_城市灬边缘的博客-CSDN博客
这位博主。调试运行库,让VS进行提示(具体是:点击“本地Windows调试器”,仔细看输出窗口的文件路径),我发现有个库加载了很多次,每次都卡在那里,然后就出bug。需要进行dll替换。
因此合理推断,也许是dll库本身出现了问题,需要进行替换。
注意,如果真是这一步出现了问题,它提示哪个dll库有问题,率先查是否不存在这个库,或者存在这个库,但内容可能不对。这时就最好不要乱从网上下载了。我是在Matlab中找到了对应的库(或者在VS的dll里翻翻),把对应的库直接替换进去。
这样应该就没问题了。
五.成功编译运行后,如何测试engine引擎是否可用
测试代码详见:
(3条消息) C++通过engine引擎调用matlab_山有木兮°的博客-CSDN博客
应该是可以直接运行成功,不需要进行任何修改。
引用了上面几位博主的内容,对遇到的问题进行梳理,回忆了自己测试时的流程。