MatLab C++ 共享 Dll 库初始化崩溃

MatLab C++ Shared Dll Library Initialization Crash

我正在使用 Matlab 2013a 和 Visual Studio 2013。我正在尝试从 C++ 控制台应用程序使用 MatLab 编译的 dll。我的简单 Matlab 测试 dll 和控制台应用程序是为 64 位机器编译的(我通过 dumpbin 确保它们是 64 位的)。我的机器上也安装了正确版本的 MCR(即使没有必要)。

我使用 "mbuild -setup" 命令设置我的编译器。

我使用此命令行编译我的 .m 文件:"mcc -v -W cpplib:mylib -T link:lib myFunc" 成功。

在我的控制台应用程序中,我包含了这些库:mylib.lib、mclmcrrt.lib、mclmcr.lib、libmx.lib、libmat.lib 并在此使用这些库路径 "C:\Program Files\MATLAB\R2013a\extern\lib\win64\microsoft"

当我调试我的程序时,它使用此调用成功初始化了 MCR:"mclInitializeApplication(NULL, 0)" 但是当我调用 "mylibInitialize()" 来初始化我的库时,程序崩溃了。它甚至不会抛出异常,因此我无法使用 try/catch 块来处理它。它给出未处理的异常和访问错误消息。

这些是我得到的示例调试输出消息;

MatlabTest.exe 中 0x00007FFA22761F08 的第一次机会异常:Microsoft C++ 异常:xercesc_2_7::NoSuchElementException 在内存位置 0x000000E263EF4E48。

MatlabTest.exe 中 0x00007FFA22761F08 处的第一次机会异常:Microsoft C++ 异常:xsd_binder::MalformedDocumentError 在内存位置 0x000000E263EF4E40。

MatlabTest.exe 中 0x00007FFA22761F08 的第一次机会异常:Microsoft C++ 异常:xercesc_2_7::NoSuchElementException 在内存位置 0x000000E263EF4E48。

MatlabTest.exe 中 0x00007FFA22761F08 的第一次机会异常:Microsoft C++ 异常:boost::thread_interrupted 在内存位置 0x000000E2643FF630。

MatlabTest.exe 中 0x00007FFA22761F08 的第一次机会异常:Microsoft C++ 异常:boost::thread_interrupted 在内存位置 0x000000E2642FFCD0。

MatlabTest.exe 中 0x00007FFA22761F08 的第一次机会异常:Microsoft C++ 异常:CryptoPP::AES_PHM_Decryption::InvalidCiphertextOrKey 在内存位置 0x000000E264EFB0F0。

MatlabTest.exe 中 0x00007FFA22761F08 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x000000E264EF4C10 处的 tfFailedException。

MatlabTest.exe 中 0x00007FFA22761F08 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x000000E264EF9410 处的 varflowFailedException。线程 0x3550 已退出,代码为 0 (0x0)。 'MatlabTest.exe' (Win32):已加载 'C:\Program Files\MATLAB\R2013a\bin\win64\hgbuiltins.dll'。无法找到或打开 PDB 文件。

MatlabTest.exe 中 0x0000000000B46E60 (m_interpreter.dll) 的第一次机会异常:0xC0000005:读取位置 0x0000000064EF3B90 的访问冲突。 MatlabTest.exe 中 0x0000000000B46E60 (m_interpreter.dll) 的未处理异常:0xC0000005:访问冲突读取位置 0x0000000064EF3B90.

程序“[12952] MatlabTest.exe”已退出,代码为 0 (0x0)。

我在另一台机器上安装了 MCR 并尝试 运行 这个控制台应用程序。我得到了相同的结果。

我也试过 Loren 的 Vigenere 例子, http://blogs.mathworks.com/loren/2011/02/03/creating-c-shared-libraries-and-dlls/#respond

也没用。

你知道为什么会这样吗?

谢谢

看来问题是 MATLAB 和 Visual Studio 版本不匹配。如果我将 MatLab 2016a 与 Visual Studio 2013 一起使用,则没有问题,一切正常。

我在使用 Matlab2017 + VS 2015 时遇到了类似的问题。 可能与 MATLAB 使用的 java 有一些冲突。

我已经使用

修复了它
const char *args[] = {"-nojvm"};
const int count = sizeof(args) / sizeof(args[0]);
mclInitializeApplication(args, count))

而不是

mclInitializeApplication(NULL,0)