【问题标题】:Matlab binding of a C++ library using SWIG使用 SWIG 对 C++ 库进行 Matlab 绑定
【发布时间】:2014-12-27 04:47:07
【问题描述】:

我已经在使用 SWIG 将一些 C++ 库移植到 Python 中,结果的质量给我留下了深刻的印象。所以我想坚持使用 SWIG..

最近有人问我要一个 Matlab 端口。这样的想法实际上已经在我的 todolist 中了。但每次我在 谷歌搜索 时我都找不到足够稳定和易于维护的东西(也是因为对 Matlab 及其调用 C/C++ 代码的几种方法的低技能)。

据我了解,在主分支中存在一种未维护且几乎没有记录的方式来执行此操作,并且在此方向上的许多其他尝试都没有达到足够成熟以成为主分支的一部分:link。我想跨平台,因此我认为 COM 方式可能不是我的解决方案。

不过,这一次我发现有一个分支看起来相当有前途:link 有人已经测试过这个解决方案了吗?以防万一,一个从 Matlab 调用移植的 C++ 代码的简单工作示例会很有帮助..

编辑 1:我删除了对 C++11 的任何引用

编辑 2:matlab 分支(在答案中引用)目前正在评估中,以便与 swig 主合并(请参阅:https://github.com/jaeandersson/swig/issues/72https://sourceforge.net/p/swig/mailman/message/35209729/

【问题讨论】:

  • 你为什么不直接创建 mex 函数来包装你的 C++ 代码呢?
  • 因为所有端口都使用相同的工具对我来说似乎很有吸引力。如果我找不到稳定的 SWIG 方式,我一定会听从你的建议!
  • 展示如何使用 SWIG 将 C API(我的 C++11 库中已有的)移植到 Matlab 的工作示例也可以解决我的问题!
  • 我正在做同样的事情,并且有一个幼稚的想法。为什么不 SWIG 将它用于 JAVA 并将 java 包导入 Matlab?
  • 这是许多可能的解决方法之一,但不是最佳解决方案,因为在我看来它有点麻烦并且还可能影响性能.. 只是我的个人意见!

标签: c++ matlab binding swig


【解决方案1】:

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

在 matlab 中使用它非常容易。您可以在 swig/Doc/Examples/matlab/ 中找到示例。测试套件还有更多。

为了构建简单的例子,你可以运行 swig 来生成 C++ mex 文件,然后从 matlab 做

mex yourModuleWrap.cxx

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

HTH

克里斯

【讨论】:

    【解决方案2】:

    由于我参与了当前为 SWIG 实现 MATLAB 模块的工作(我在您链接的邮件中写过),因此我可以提供一些背景信息并报告 2014 年 11 月的状态。

    使用各种不同的方法为 SWIG 实现 MATLAB 模块已经进行了多次努力。截至今天(2014 年 11 月),它们都还没有成功地融入 SWIG 的主分支(我们希望在不久的将来改变这一点,见下文)。

    和你一样,我正在使用 SWIG 将 C++ 项目(称为CasADi)移植到 Python,并且几年来一直在关注 SWIG 中 MATLAB 支持的发展,因为这对我们的项目非常有用。在我有点参与的努力未能通过概念验证阶段之后,我决定自己试一试。今年 4 月(2014 年),我开始编码,它比我预期的要顺利得多。经过大约 2 周的编码,我已经实现了核心功能(包装函数、类等),并将其发布到 SWIG 社区。我很高兴看到 SWIG 列表中的很多积极响应,更高兴看到像 Kris(见他的回答)这样的人加入了这项工作并做出了巨大贡献。

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

    最后,您的问题提到了 C++11。这确实是一个与 MATLAB 模块工作完全不同的问题。涉及 C++11 的内容主要在 SWIG 中处理,这与您输出到哪种语言无关。所以一般请查阅 SWIG 中的 C++11 支持。

    【讨论】:

      【解决方案3】:

      我在 matlab 与 swig 的集成方面也提供了一些帮助——尽管主要是作为一名测试人员。您可以按照以下说明使用 SWIG 连接我的库 (CoolProp):http://www.coolprop.dreamhosters.com:8010/sphinx/

      大致流程是这样的:

      1. 编译一个包含 matlab 支持的 swig 版本。这里有一个构建脚本:https://github.com/CoolProp/CoolProp/blob/master/dev/scripts/build_swig_matlab.py
      2. 使用这个特殊的 swig 版本,像平常一样编译。我们使用 CMake,所以一个粗略的 sn-p 可以让所有东西都很好地协同工作,就像这样:

      ```

      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 中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-01
        • 2019-10-14
        • 1970-01-01
        • 2010-12-02
        • 2011-12-10
        • 2021-01-29
        • 1970-01-01
        相关资源
        最近更新 更多