VS2019调用Matlab2019b生成的dll时初始化异常

发布时间 2023-06-20 19:10:26作者: 手磨咖啡

在Visual Studio中使用C++调用Matlab程序

我目前在写一个用VS和Matlab混编的程序,由于之前的版本(VS2005+MATLAB2010b)太老了,现在想换用VS2019+MATLAB2019b的版本。我原本以为会很简单就能完成配置,没想到在运行时会出现下面的问题。(帧不在模块中。在加载的模块中未找到当前堆栈帧。无法显示此位置的源代码。)

VS与MATLAB版本选择

如上所述,本次我用的软件是VS2019和MATLAB2019b,如果你用的是其他版本的软件可以在MATLAB官网查找,此版本的MATLAB支持哪个版本的编译器。

https://ww2.mathworks.cn/support/requirements/previous-releases.html

 在Supported Compilers一栏中,点击Details,即可查看支持的编译器,已根据MATLAB版本选择相应版本的VS,或者根据当前的VS版本选择要配合编程的MATLAB版本。

VS与MATLAB混编的环境配置

各个版本的环境配置大同小异,能搜到的详细步骤比较多,下面列出对我比较有帮助的博文。

在Visual Studio中使用C++中调用MATLAB程序

C++调用Matlab生成的DLL动态链接库进行混合编程(win10+VS2015+Matlab2016b)

VS与matlab混合编程

初始化异常的解决

检查代码后,发现在调用初始化时[名字]Initialize(),程序就会引发此异常。

0xc0000005处理

一开始我在网上搜解决方案时,一直纠结在“帧不在模块中。在加载的模块中未找到当前堆栈帧。无法显示此位置的源代码。”这句话之中,后来试着搜了异常信息0xc0000005:读取位置0x0000000000000008,发现了一个博文就能够解决这个问题。

matlab导出dll及c++调用matlab初始化异常处理

  

这里的解决办法是:

1.调试–>窗口–>异常设置

 2.取消勾选Win32 Exceptions

 但是,我做了这一步后,程序能够跑出来了,只是输出窗口会有很多异常信息xsd_binder::MalformedDocumentError,下面可以解决这个问题。

Debug错误:xsd_binder::MalformedDocumentError

主要参考:

Matlab与C++混合编程

解决办法:

属性-调试(debugging)-调试器类型(debugger type):自动(auto)修改成混合(mixed)

之后,我发现将调试器类型改为混合,即使在异常设置中不取消勾选Win32 Exceptions,程序也能正常运行,且没有异常信息。