Mex динамическое управление памятью с std :: vector в связанной внешней DLL;Ошибка сегментации - PullRequest
1 голос
/ 12 июня 2011

Я пытаюсь создать mex-файл, который связывает MATLAB с внешней библиотекой C ++, которая связывается с некоторым оборудованием. Импортная библиотека и предварительно скомпилированные библиотеки DLL (.lib и .dll) предоставляются поставщиком оборудования для моей версии VC ++, и я смог реализовать их на C ++ без каких-либо проблем.

Однако я столкнулся с ошибкой сегментации во время выполнения, когда код был написан как mex (скомпилированный с той же версией VC ++). После некоторого исследования с помощью отладчика VC ++ вероятным виновником, по-видимому, является тот факт, что одна из внешних функций dll возвращает тип данных std :: vector и, вероятно, пытается динамически выделить память для векторного контейнера где-то внутри функции. Я знаю, что если я использую std :: vector в своей собственной функции mex, все работает нормально, но я подозреваю, что сам заголовок mex оборачивает контейнер std :: vector в моем собственном коде для управления памятью (?), Как требуется для всех динамически выделил память в мекс-кодах, тогда как он не может сделать то же самое для предварительно скомпилированного .dll.

Теперь возникает вопрос: поскольку я не могу изменить внешний файл .dll и не имею доступа к его исходным файлам, есть ли какие-либо способы работы с этим внешним dll, чтобы динамическая память управлялась MATLAB (возможно, оболочкой какой-то ..?) ... и, таким образом, избежать ошибки сегментации и вернуть правильные данные? Или, если мой анализ неверен, пожалуйста, исправьте меня тоже!

Пожалуйста, дайте мне знать, если есть какие-либо идеи или взломы, спасибо!

Моя система: 32-разрядная версия Windows 7 с пакетом обновления 1 (SP1), MATLAB 2009b, Visual C ++ 2008 Pro.

Я также разместил тот же вопрос по адресу: http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error . Вы также можете поделиться своим мнением там, если у вас есть аккаунт, спасибо!

Ответы [ 2 ]

2 голосов
/ 14 июня 2011

Спасибо всем за ответы и комментарии.Мне удалось решить проблему с помощью дружественных людей из MathWorks.

Из исходного сообщения на http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error:

Возможно, вы видите несовместимостьмежду библиотекой stl и / или параметрами компилятора, используемыми вашей предварительно скомпилированной dll, и теми, которые используются MATLAB и командой MEX.MATLAB 2009b был создан с MSVC 2005.

Вы можете решить проблему, изменив параметры, используемые mex, или создав свой mex-файл напрямую с помощью MSVC.Одним из примеров опции, которая может влиять на вещи, является SECURE_SCL = 0.Я хотел бы начать с построения вашей тестовой программы с параметрами, которые использует MATLAB для поиска проблемного параметра, а затем попытаться удалить этот параметр при создании файла mex.

Из-за такого рода несовместимости использование объектов stl в API-интерфейсахсторонние скомпилированные библиотеки, как правило, плохая идея.

Следуя его советам, я удалил опцию SECURE_SCL = 0 из файла опций mex по адресу

C: \ Users \ (имя пользователя)\ AppData \ Roaming \ MathWorks \ MATLAB \ R2009b \ mexopts.bat

Затем перекомпилировал mex-файл, теперь все работает как чудо - функция возвращает правильные данные и ошибка сегментации больше не возникает.

1 голос
/ 12 июня 2011

MEX API не делает ничего особенного с контейнерами STL, поскольку они не могут передаваться между MATLAB и MEX-функцией (единственный непримитивный тип данных, который может это делать, это mxArray). В основном это зависит от MEX-функции, чтобы убедиться, что память, используемая контейнером STL, обрабатывается правильно; MATLAB не отслеживает это.

Передача std :: vector через границу DLL несколько сложна. Я бы предположил, что поставщик знает об этом, и предоставит вам соответствующий заголовочный файл с правильными declspecs и тому подобным, но в случае, если они этого не сделали, вы можете обратиться к этой ссылке поддержки Microsoft чтобы узнать больше о том, что требуется.

...