Связывание Matlab библиотеки С++ с использованием SWIG
Я уже использую SWIG для переноса некоторых библиотек С++ в Python, и я действительно впечатлен качеством результатов. Поэтому я хотел бы придерживаться SWIG..
Недавно кто-то спросил меня о порту Matlab. Такая идея была на самом деле уже у моего тодолиста.. но каждый раз, когда я искал для этого, я не нашел ничего стабильного и легкого в обслуживании (также из-за моих низких навыков с Matlab и его нескольких способов назвать C/С++ код).
По моему пониманию, в основной ветке есть недостоверный и едва документированный способ сделать это, и многие другие попытки такого направления, которые не достигли достаточной зрелости, стать частью основной ветки: ссылка. Я хотел бы быть кросс-платформенным, поэтому я не думаю, что способ COM может быть для меня решением.
Однако на этот раз я обнаружил, что есть ветка, которая выглядит довольно многообещающе: ссылка
Кто-то уже тестировал это решение? В случае, очень простой рабочий пример, который вызывает портированный код С++ из Matlab, будет очень полезен.
EDIT 1: я удалил любую ссылку на С++ 11
EDIT 2: ветвь matlab
(указанная в ответах) в настоящее время находится в оценке для объединения с мастером swig
(см. https://github.com/jaeandersson/swig/issues/72 и https://sourceforge.net/p/swig/mailman/message/35209729/)
Ответы
Ответ 1
Поскольку я являюсь частью нынешних усилий по внедрению модуля MATLAB для SWIG (о котором я писал в связанной с вами почтой), я мог бы предоставить немного информации и сообщить о статусе в ноябре 2014 года.
Было предпринято несколько усилий по внедрению модуля MATLAB для SWIG с использованием различных подходов. На сегодняшний день (ноябрь 2014 года) ни один из них еще не был успешным в смысле включения в ведущую ветвь SWIG (мы надеемся изменить это, хотя и в недалеком будущем, см. Ниже).
Как и вы, я использую SWIG для переноса проекта С++ (называемого CasADi) на Python и следуя за разработками поддержки MATLAB в SWIG уже пару лет, так как это было бы очень полезно для нашего проекта. После того, как я несколько участвовал в этом, я не смог пройти стадию доказательства концепции, я решил сам сделать это. В апреле этого года (2014) я начал кодировать, и он стал намного более плавным, чем я ожидал. Примерно через 2 недели кодирования у меня уже была реализована основная функциональность (функции упаковки, классы и т.д.), Которые я опубликовал в сообществе SWIG. Я был счастлив увидеть много положительных отзывов из списка SWIG и даже больше рад видеть, что такие люди, как Крис (см. Его ответ), присоединяются к усилиям и вносят большой вклад.
Состояние модуля прямо сейчас состоит в том, что он имеет большую функциональность и успешно используется для Casadi и других проектов. Для меня это ясно показывает, что выбранный подход является правильным, даже если есть некоторая работа, которую нужно сделать до того, как модуль будет стабильным и документированным. Я надеюсь, что смогу сделать еще один толчок и фактически сумею довести модуль SWIG до состояния, в котором он может быть включен в ветвь мастера SWIG. Но это зависит от того, когда/когда мне удастся обеспечить финансирование для работы над этим. Я уверен, что это может произойти совсем скоро.
Наконец, в вашем вопросе упоминается С++ 11. Это действительно отдельная проблема из работы над модулем MATLAB. Материалы, связанные с С++ 11, в основном заботятся в SWIG в том вопросе, который не зависит от того, на каком языке вы выводите. Поэтому ознакомьтесь с поддержкой С++ 11 в SWIG в целом.
Ответ 2
Как вы уже узнали, для SWIG и MATLAB была проведена недавняя работа. Это было начато Джоэлем Андерссоном (основываясь на предыдущих усилиях), и с тех пор я помог. Мы оба не в срок, но все-таки работаем в разумном состоянии. Несколько человек уже использовали его для упаковки "производственного" кода на С++. К сожалению, у нас нет простого списка TODO в любом месте, но проверьте разговоры в списке swig-devel.
Использование этого из matlab довольно просто. Примеры можно найти в swig/Doc/Examples/matlab/. В тестовом пакете есть еще несколько.
Для создания простых примеров вы можете просто запустить swig для создания файла сценария С++, а затем из matlab do
mex yourModuleWrap.cxx
Для более сложных вещей вам нужно будет добавить свою собственную библиотеку в файл mex. В списке swig-devel вы также найдете образцы файлов для использования CMake.
НТН
Kris
Ответ 3
Я тоже немного помог с интеграцией Matlab с swig - хотя прежде всего в качестве тестера. Вы можете следовать инструкциям для интерфейса моей библиотеки (CoolProp) с помощью SWIG, следуя инструкциям: http://www.coolprop.dreamhosters.com:8010/sphinx/
Примерно так:
`` `
if (COOLPROP_MATLAB_SWIG_MODULE)
# Must have SWIG
FIND_PACKAGE(SWIG REQUIRED)
INCLUDE(${SWIG_USE_FILE})
find_package(Matlab REQUIRED)
IF(MATLAB_FOUND)
message(STATUS "MATLAB Found, MATLAB MEX will be compiled.")
ELSE(MATLAB_FOUND)
MESSAGE("MATLAB not found...nothing will be built.")
ENDIF(MATLAB_FOUND)
set(I_FILE "${CMAKE_SOURCE_DIR}/src/CoolProp.i")
list (APPEND APP_SOURCES ${CMAKE_SOURCE_DIR}/wrappers/MATLAB/Matlabdef.def) # To export mexFunction
SET_SOURCE_FILES_PROPERTIES(${I_FILE} PROPERTIES CPLUSPLUS ON)
SWIG_ADD_MODULE(CoolPropMATLAB_wrap matlab ${I_FILE} ${APP_SOURCES})
SWIG_LINK_LIBRARIES(CoolPropMATLAB_wrap ${MATLAB_LIBRARIES})
add_definitions(/DMATLAB_MEX_FILE) #define matlab macros
add_definitions(/DMX_COMPAT_32)
add_custom_command(TARGET CoolPropMATLAB_wrap
POST_BUILD
COMMAND 7z a "+CoolProp.7z" "+CoolProp"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
if(WIN32) # 32-bit or 64-bit mex
if (CMAKE_CL_64)
SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexw64)
else()
SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES SUFFIX .mexw32)
endif()
else()
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if (${BITNESS} EQUAL "32")
SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexmaci32 PREFIX "")
elseif((${BITNESS} EQUAL "64"))
SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexmaci64 PREFIX "")
endif()
else()
if (CMAKE_SIZEOF_VOID_P MATCHES "8")
SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexa64 PREFIX "")
else()
SET_TARGET_PROPERTIES(CoolPropMATLAB_wrap PROPERTIES PREFIX "" SUFFIX .mexglx PREFIX "")
endif()
endif()
endif()
add_dependencies (CoolPropMATLAB_wrap generate_headers)
install (FILES ${CMAKE_CURRENT_BINARY_DIR}/+CoolProp.7z DESTINATION ${CMAKE_INSTALL_PREFIX}/MATLAB)
install (TARGETS CoolPropMATLAB_wrap DESTINATION ${CMAKE_INSTALL_PREFIX}/MATLAB)
endif()
`` `
- Загрузите скомпилированный модуль в MATLAB