Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+的Matlab绑定+;使用SWIG的图书馆 我已经使用SWIG在Python中移植了一些C++库,而且我对结果的质量印象深刻。所以我想继续用SWIG_C++_Matlab_Binding_Swig - Fatal编程技术网

C+的Matlab绑定+;使用SWIG的图书馆 我已经使用SWIG在Python中移植了一些C++库,而且我对结果的质量印象深刻。所以我想继续用SWIG

C+的Matlab绑定+;使用SWIG的图书馆 我已经使用SWIG在Python中移植了一些C++库,而且我对结果的质量印象深刻。所以我想继续用SWIG,c++,matlab,binding,swig,C++,Matlab,Binding,Swig,最近有人向我要一个Matlab端口。这样的想法其实已经出现在我的托多利斯特身上了。。但每次我在谷歌上搜索时,我都没有发现足够稳定和易于维护的东西(这也是因为我对Matlab及其调用C/C++代码的两种方法的技能很低) 据我所知,在主分支中有一种未维护且几乎没有文档记录的方法来实现这一点,并且在这一方向上的许多其他尝试都没有达到足够的成熟度,无法成为主分支的一部分:。我喜欢跨平台,因此我不认为COM方式可能是我的解决方案 然而,这次我发现有一个分支看起来很有希望: 有人已经测试过这个解决方案了吗?

最近有人向我要一个Matlab端口。这样的想法其实已经出现在我的托多利斯特身上了。。但每次我在谷歌上搜索时,我都没有发现足够稳定和易于维护的东西(这也是因为我对Matlab及其调用C/C++代码的两种方法的技能很低)

据我所知,在主分支中有一种未维护且几乎没有文档记录的方法来实现这一点,并且在这一方向上的许多其他尝试都没有达到足够的成熟度,无法成为主分支的一部分:。我喜欢跨平台,因此我不认为COM方式可能是我的解决方案

然而,这次我发现有一个分支看起来很有希望: 有人已经测试过这个解决方案了吗?在一个简单的工作例子中,调用来自MATLAB的端口C++代码会很有帮助。p> 编辑1:我已经删除了对C++11的任何引用


编辑2:
matlab
分支(在答案中引用)目前正在评估中,将与
swig
主机合并(请参见:和)

正如您所发现的,swig和matlab最近有一些活动。这是由乔尔·安德森(Joel Andersson)发起的(基于之前的努力),从那以后我一直在提供帮助。我们俩都没时间了,但我们确实让它工作到了一个合理的状态。一些人已经使用它来封装“生产”C++代码。遗憾的是,我们没有一个简单的待办事项列表,但检查swig-devel列表上的对话

从matlab中使用它是相当容易的。您可以在swig/Doc/examples/matlab/中找到示例。测试套件中还有一些

<> p>为了构建简单的例子,可以只运行SWIG生成C++ MeX文件,然后从Matlab DO

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


Kris

由于我是目前为SWIG实现MATLAB模块工作的一部分(我在您链接的邮件中写到了这一点),我可以提供一些背景信息,并报告截至2014年11月的状态

为了实现SWIG的MATLAB模块,已经做出了一些努力,使用了各种不同的方法。截至今天(2014年11月),尚未有任何一家公司成功并入SWIG的主分支机构(我们希望在不久的将来改变这一点,见下文)

<> P>像你一样,我用SWIG把C++项目(叫)移植到Python,并在Wistg上支持了几年的Matlab支持,因为这对我们的项目非常有用。在我参与的一次努力未能通过概念验证阶段后,我决定自己试一试。今年4月(2014年),我开始编写代码,比我预期的要顺利得多。经过大约两周的编码,我已经实现了核心功能(包装函数、类等),并将其发布到SWIG社区。我很高兴看到SWIG列表中有很多积极的回应,更高兴看到像克里斯(见他的答案)这样的人加入到这项工作中并做出了巨大的贡献

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


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

我也在matlab与SWIG的集成方面提供了一些帮助,尽管主要是作为测试人员。您可以按照以下说明使用SWIG与我的库(CoolProp)进行交互:

大致过程如下:

  • 编译包含matlab支持的swig版本。这里有一个构建脚本:
  • 使用这个特殊的swig版本,可以像正常一样编译。我们使用CMake,因此一个粗略的片段可以使所有内容都很好地结合在一起,如下所示:
  • ```

    ```

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

  • 为什么不创建MEX函数来包装C++代码呢?因为它对所有端口都有相同的工具,我很有吸引力。如果我找不到稳定的饮用方式,我一定会听从你的建议!一个工作示例演示了如何使用SWIG将C API(我已经为我的C++11库提供了)移植到Matlab,这也解决了我的问题!我也在做同样的事情,并且有一个天真的想法。为什么不将其转换为JAVA并将JAVA包导入Matlab?这是许多可能的解决方法之一,但不是最佳解决方案,因为在我看来,这有点麻烦,还可能影响性能。。只是我个人的意见!
    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()