Использование объектов MATLAB из пользовательских библиотек C++ для использования функциями MEX.C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Использование объектов MATLAB из пользовательских библиотек C++ для использования функциями MEX.

Сообщение Гость »


Мой текущий файл MEX компилируется правильно, однако я хотел бы создать, скажем, несколько файлов MEX:
[*]mex_a.cpp [*]mex_b.cpp [*]mex_c.cpp
На данный момент mex_a.cpp содержит типичное определение функции:

класс MexFunction: public matlab::mex::Function { частный: // Получаем указатель на движок std::shared_ptr matlabPtr = getEngine(); // Получаем фабрику массивов std::shared_ptr FactoryPtr; частный: void оператор() (выходные данные matlab::mex::ArgumentList, входные данные matlab::mex::ArgumentList) переопределить { пытаться { // Анализ входных данных.. mex_aux->mex_common_function(...) // Анализ выходных данных.. } поймать (интервал) { std::fprintf(stdout, «ОШИБКА: произошло что-то неожиданное...»); } } В mex_aux мы можем найти определение и реализацию mex_common_function. Целью этого объекта является использование mex_a.cpp, mex_b.cpp и mex_c.cpp, что, по сути, и делает обычная библиотека.

Мои выводы:
[*]Если mex_common_function статична, все работает. [*]Иначе это не будет работать при использовании объектов Matlab.
Файл .hpp выглядит так:

#pragma один раз // Подключаем системные библиотеки # включаем # включаем // материал MATLAB #include "mex.hpp" класс mex_aux { публика: // Конструктор mex_aux() = по умолчанию; // Деструктор ~mex_aux() = по умолчанию; частный: // Получаем указатель на движок std::shared_ptr matlabPtr; // Получаем фабрику массивов std::shared_ptr FactoryPtr; публика: // Сеттеры: void set_matlab_ptr(std::shared_ptr& matlab_ptr) {this->matlabPtr = matlab_ptr; } void set_factory_ptr(std::shared_ptr& Factory_ptr) {this->factoryPtr = Factory_ptr; } публика: // Используемая функция, если она установлена ​​как статическая (следовательно, не использует члены класса), она работает. void mex_common_function(); То, что я делаю сейчас и, следовательно, получаю следующую ошибку в MATLAB (не во время сборки):
[*]Установка matlabPtr в качестве внутреннего указателя в mex_aux. [*]То же самое для factoryPtr.
Как из основного файла функции mex (т. е. mex_a.cpp), после создания mex_aux, используются установщики.

Ошибка в MATLAB:

Неверный MEX-файл '/путь/к/mex/mexfunction.mexa64': /путь/к/external/libextern.so: неопределенный символ: _ZN6matlab6engine12MATLABengine5fevalERKNSt7__cxx1112basic_stringIDsSt11char_traitsIDsESaIDsEEEiRKSt6vectorINS_4data5ArrayESaISC_EERKSt10shared_ptrISt15basic_streambufIDsS5_EESM_ Ошибка в mex_vsod (строка 50) b(:,:,i) = mexfunction(...); Мой CMakeLists.txt:

# Библиотека MEX AUX установить (LIBRARY_MEX_AUX "mex_aux") add_library(${LIBRARY_MEX_AUX} ОБЩИЙ src/core/tools/mex_aux.cpp) target_link_libraries(${LIBRARY_MEX_AUX} ${Matlab_MEX_LIBRARY} ${Matlab_MX_LIBRARY}) set_target_properties(${LIBRARY_MEX_AUX} СВОЙСТВА COMPILE_FLAGS "-fPIC" LINK_FLAGS "-Wl,-rpath,./") # Для использования относительных путей в общих библиотеках # MEX-ФАЙЛОВ если (BUILD_WITH_MATLAB) # Файлы функций MEX matlab_add_mex(ИМЯ mex_vsaod SRC источник/main/mex_cpp/mex_a.cpp LINK_TO ${LIBRARY_target1} ... ${LIBRARY_targetN} ${LIBRARY_MEX_AUX}) конециф () Я предполагаю, что что-то не так происходит в памяти из-за указателя из mex_aux, который, возможно, указывает на недоступное место в памяти (только в пределах mex-файла -mex_a.cpp?-). ..

Может кто-нибудь подсказать? Буду очень признателен.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»