Сбой при инициализации общей библиотеки DLL MatLab C++

Я использую Matlab 2013a и Visual Studio 2013. Я пытаюсь использовать скомпилированную dll MatLab из консольного приложения C++. Моя простая тестовая dll и консольное приложение Matlab скомпилированы для 64-битных машин (я убедился, что они 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\микрософт"

Когда я отлаживаю свою программу, она успешно инициализирует MCR, используя этот вызов: "mclInitializeApplication(NULL, 0)", но когда я вызываю "mylibInitialize()" для инициализации моей библиотеки, программа аварийно завершает работу. Он даже не вызывает исключение, поэтому я не могу обработать его с помощью блока try/catch. Это дает необработанное исключение и сообщение об ошибке доступа.

Это примеры выходных сообщений отладки, которые я получил;

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: xercesc_2_7::NoSuchElementException в ячейке памяти 0x000000E263EF4E48.

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: xsd_binder::MalformedDocumentError в ячейке памяти 0x000000E263EF4E40.

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: xercesc_2_7::NoSuchElementException в ячейке памяти 0x000000E263EF4E48.

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: boost::thread_interrupted в ячейке памяти 0x000000E2643FF630.

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: boost::thread_interrupted в ячейке памяти 0x000000E2642FFCD0.

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: CryptoPP::AES_PHM_Decryption::InvalidCiphertextOrKey в ячейке памяти 0x000000E264EFB0F0.

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: tfFailedException в ячейке памяти 0x000000E264EF4C10.

Исключение первого шанса по адресу 0x00007FFA22761F08 в MatlabTest.exe: исключение Microsoft C++: varflowFailedException в ячейке памяти 0x000000E264EF9410. Поток 0x3550 завершился с кодом 0 (0x0). «MatlabTest.exe» (Win32): загружен «C:\Program Files\MATLAB\R2013a\bin\win64\hgbuiltins.dll». Не удается найти или открыть файл PDB.

Исключение первого шанса по адресу 0x0000000000B46E60 (m_interpreter.dll) в MatlabTest.exe: 0xC0000005: место чтения нарушения прав доступа 0x0000000064EF3B90. Необработанное исключение по адресу 0x0000000000B46E60 (m_interpreter.dll) в MatlabTest.exe: 0xC0000005: место чтения нарушения прав доступа 0x0000000064EF3B90.

Программа «[12952] MatlabTest.exe» завершилась с кодом 0 (0x0).

Я установил MCR на другую машину и попытался запустить это консольное приложение. Я получил тот же результат.

Я также попробовал пример Лорен Виженера, http://blogs.mathworks.com/loren/2011/02/03/creating-c-shared-libraries-and-dlls/#respond

Это тоже не сработало.

У вас есть идеи, почему это происходит?

Спасибо


person cbr    schedule 31.05.2016    source источник


Ответы (2)


Кажется, проблема в несоответствии версий MATLAB и Visual Studio. Если я использую MatLab 2016a с Visual Studio 2013, проблем нет, и все работает отлично.

person cbr    schedule 15.06.2016

У меня была аналогичная проблема с Matlab2017 + VS 2015. Возможно, есть конфликт с java, используемой MATLAB.

Я исправил это с помощью

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

вместо

mclInitializeApplication(NULL,0)
person Ilya Ovodov    schedule 25.01.2018
comment
Вы потеряете пользовательский интерфейс Matlab (они вам действительно нужны, когда вы вызываете его из C++?), но в любом случае это лучше, чем нарушение прав доступа. - person Ilya Ovodov; 25.01.2018