Подтвердить что ты не робот

Связывание 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/)

4b9b3361

Ответ 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/

Примерно так:

  • Скомпилируйте версию swig, которая включает поддержку matlab. Существует сборка script здесь: https://github.com/CoolProp/CoolProp/blob/master/dev/scripts/build_swig_matlab.py
  • Используя эту специальную версию swig, скомпилируйте ее как обычно. Мы используем CMake, поэтому грубый фрагмент, чтобы все было хорошо сочетаться, - это что-то вроде:

`` `

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()

`` `

  1. Загрузите скомпилированный модуль в MATLAB