2014-10-30 55 views
12

我已经使用SWIG来移植Python中的一些C++库,并且我对结果的质量印象深刻。所以我想坚持SWIG ..使用SWIG的C++库的Matlab绑定

最近有人问我一个Matlab端口。这样的想法实际上已经在我的todolist ..但每次我是谷歌搜索因为我没有发现足够的稳定和容易维护(也因为我的Matlab技能​​低,以及它的几种方法调用C/C++代码)。

根据我的理解,在主分支中有这样一种无法维护且几乎没有文档记录的方法,并且在这样一个方向上还没有达到足够的成熟度以成为主分支的一部分:link。我想要跨平台,因此我不认为COM方式可能是我的解决方案。

但是,这一次我发现有一个看起来很有希望的分支:link 有人已经测试过这个解决方案吗?在情况下,调用由Matlab的停泊的C++代码将是非常有益的简单工作示例..

EDIT 1:我已删除到C++ 11

EDIT 2的任何参考:本matlab分支(引在答案中)目前正在评估中与swig master(参见:https://github.com/jaeandersson/swig/issues/72https://sourceforge.net/p/swig/mailman/message/35209729/)合并

+1

为什么不直接创建mex函数来包装C++代码呢? – Praetorian 2014-10-30 23:25:01

+3

因为它对所有端口都有相同的工具似乎很有吸引力。如果我找不到稳定的SWIG方式,我一定会按照你的建议! – gmas80 2014-10-30 23:33:11

+0

一个演示如何使用SWIG将C API(我已经拥有的C++ 11库)移植到Matlab的工作示例也解决了我的问题! – gmas80 2014-11-08 19:40:15

回答

8

自从我采取了痛饮MATLAB模块(这是我在你链接的电子邮件中写道约)的当前努力的一部分,我可以提供一点背景和报告状态为2014年11月。

使用各种不同的方法来实现一个用于SWIG的MATLAB模块已经有了很多努力。截至今天(2014年11月),其中没有一家成功纳入SWIG的主分支机构(我们希望在不太遥远的将来改变这一点,见下文)。

与您一样,我正在使用SWIG将一个C++项目(称为CasADi)移植到Python中,并且在SWIG中一直遵循几年来MATLAB支持的发展,因为这对我们的项目非常有用。经过我有点参与的努力,未能通过概念证明阶段,我决定自己一试。今年四月(2014年),我开始编码,并且比我预期的更顺畅。经过大约2周的编码之后,我已经实现了我发布给SWIG社区的核心功能(包装功能,类别等)。我很高兴看到SWIG名单中的很多积极回应,更高兴地看到像克里斯这样的人(看到他的回答)加入努力并做出了巨大贡献。

模块现在的状态是它实现了大多数功能,并已成功用于CasADi和其他项目。对我来说,它清楚地表明所选择的方法是正确的,即使在模块稳定并记录之前还有一些工作要做。我希望能够再次推动并实际设法将SWIG模块带入可以并入SWIG主分支的状态。但是,这取决于是否/何时设法获得资金来解决这个问题。然而,我相信它可能会很快发生。

最后,你的问题提到C++ 11。这实际上是一个与MATLAB模块上的工作非常分离的问题。涉及C++ 11的内容大多在SWIG中处理,而与您要输出的语言无关。因此,请参阅SWIG中的C++ 11支持。

4

正如您发现的那样,SWIG和MATLAB已经有一些最近的活动。这是由Joel Andersson发起的(建立在以前的努力基础上),从那时起我就一直在帮助。我们都是过时的,但是确实让它工作到了一个合理的状态。一些人已经使用它来包装“生产”C++代码。可悲的是,我们没有一个简单的TODO列表,但在swig-devel列表中检查对话。

从matlab中使用这个很容易。你可以在swig/Doc/Examples/matlab /中找到例子。测试套件还有其他几个。

对于构建简单的例子,你可以只运行痛饮生成C++ MEX文件,然后从MATLAB做

mex yourModuleWrap.cxx 

对于更复杂的东西,你必须自己库添加到MEX文件。在swig-devel列表中,您还可以找到使用CMake的示例文件。

HTH

克里斯

4

我也对matlab与swig的集成有所帮助 - 虽然主要是作为测试者。您可以按照使用痛饮在下面的说明界面我的库中的指令(CoolProp):http://www.coolprop.dreamhosters.com:8010/sphinx/

大致过程是这样的:

  1. 编译痛饮的版本,其中包括MATLAB支持。这里有一个构建脚本:https://github.com/CoolProp/CoolProp/blob/master/dev/scripts/build_swig_matlab.py
  2. 使用这个特殊的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() 

```

  • 将已编译的模块加载到MATLAB中