Enlace de Matlab de una biblioteca de C++ utilizando SWIG
binding (3)
Ya estoy usando SWIG para portar algunas bibliotecas C ++ en Python, y estoy realmente impresionado por la calidad de los resultados. Entonces me gustaría seguir con SWIG ...
Recientemente, alguien me pidió un puerto de Matlab. Tal idea ya estaba en mi todolista ... pero cada vez que busqué en Google no encontré nada lo suficientemente estable y fácil de mantener (también debido a mis pocas habilidades con Matlab y sus dos maneras de llamar a C / C ++ código).
Desde mi punto de vista, hay una manera no mantenida y apenas documentada para hacer esto en la rama principal, y muchos otros intentos en tal dirección que no alcanzaron la madurez suficiente para formar parte de la rama principal: enlace . Me gustaría ser multiplataforma, así que no creo que la forma COM pueda ser la solución para mí.
Sin embargo, esta vez descubrí que hay una rama que parece bastante prometedora: enlace ¿Alguien ya ha probado esta solución? En el caso, un ejemplo de trabajo simple que llama al código portado en C ++ de Matlab sería muy útil.
EDIT 1: eliminé cualquier referencia a C ++ 11
EDIT 2: La rama de matlab
(citada en las respuestas) se encuentra actualmente en evaluación para fusionarse con el maestro de swig
(ver: https://github.com/jaeandersson/swig/issues/72 y https://sourceforge.net/ p / swig / mailman / message / 35209729 / )
Como has encontrado, ha habido alguna actividad reciente para SWIG y MATLAB. Esto fue iniciado por Joel Andersson (basándose en los esfuerzos anteriores) y desde entonces he ayudado. Los dos estamos fuera de tiempo, pero logramos que funcione en un estado razonable. Algunas personas ya lo han usado para envolver el código C ++ de "producción". Lamentablemente, no tenemos una lista TODO fácil en ninguna parte, pero verifique las conversaciones en la lista swig-devel.
Usar esto de matlab es bastante fácil. Puede encontrar ejemplos en swig / Doc / Examples / matlab /. El banco de pruebas tiene algunos más.
Para construir ejemplos simples, solo puede ejecutar swig para generar el archivo C ++ mex, y luego desde matlab do
mex yourModuleWrap.cxx
Para cosas más complicadas, tendrás que agregar tu propia biblioteca al archivo mex. En la lista swig-devel, también encontrará archivos de muestra para usar CMake.
HTH
Kris
Como soy parte del esfuerzo actual de implementar un módulo de MATLAB para SWIG (del cual escribí sobre el correo que vinculó), pude proporcionar un poco de información e informar sobre el estado en noviembre de 2014.
Ha habido varios esfuerzos para implementar un módulo MATLAB para SWIG, usando una variedad de enfoques diferentes. A día de hoy (noviembre de 2014), ninguno de ellos ha tenido éxito en el sentido de ser incorporado en la rama principal de SWIG (esperamos cambiar eso aunque en un futuro no muy lejano, ver más abajo).
Al igual que usted, estoy usando SWIG para portar un proyecto de C ++ (llamado CasADi ) a Python y he estado siguiendo desarrollos del soporte de MATLAB en SWIG durante un par de años, ya que esto sería muy útil para nuestro proyecto. Después de un esfuerzo en el que estuve involucrado de alguna manera, no superaba la etapa de prueba de concepto, decidí intentarlo yo mismo. En abril de este año (2014), comencé a codificar y fue mucho más fluido de lo que esperaba. Después de aproximadamente 2 semanas de codificación, ya tenía implementada la funcionalidad principal (funciones de ajuste, clases, etc.), que publiqué en la comunidad SWIG. Me alegró ver una gran cantidad de respuestas positivas de la lista SWIG y aún más feliz de ver a gente como Kris (ver su respuesta) uniéndose al esfuerzo y haciendo grandes contribuciones.
El estado del módulo en este momento es que tiene la funcionalidad más implementada y se ha utilizado con éxito para CasADi y otros proyectos. Para mí, demuestra claramente que el enfoque elegido es el correcto, incluso si queda algo por hacer antes de que el módulo sea estable y esté documentado. Espero poder hacer otro esfuerzo y realmente lograr llevar el módulo SWIG a un estado en el que pueda incorporarse en la rama principal de SWIG. Pero eso depende de si / cuando logro obtener fondos para trabajar en esto. Sin embargo, estoy seguro de que podría suceder bastante pronto.
Finalmente, su pregunta menciona C ++ 11. Este es realmente un problema bastante separado del trabajo en el módulo MATLAB. Lo que involucra a C ++ 11 se trata principalmente en SWIG en un asunto que es independiente del idioma al que le está enviando. Por lo tanto, consulte el soporte de C ++ 11 en SWIG en general.
Yo también he ayudado un poco con la integración de matlab con swig, aunque principalmente como probador. Puede seguir las instrucciones para conectar mi biblioteca (CoolProp) usando SWIG siguiendo las instrucciones en: http://www.coolprop.dreamhosters.com:8010/sphinx/
Aproximadamente el proceso es este:
- Compila una versión de swig que incluye el soporte de matlab. Hay un script de compilación aquí: https://github.com/CoolProp/CoolProp/blob/master/dev/scripts/build_swig_matlab.py
- Usando esta versión especial de compilación, compila como siempre. Usamos CMake, por lo que un pequeño fragmento para que todo funcione bien juntos es algo así como:
`` `
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()
`` `
- Cargue el módulo compilado en MATLAB