将MATLAB链接到DLL库

时间:2013-02-09 15:35:33

标签: matlab dll

我正在尝试从MATLAB工具包“oscmex”执行一些示例代码。该工具包允许使用OSC协议通过MATLAB进行通信。我认为这个问题不具体;它应该适用于以这种方式设置的任何工具包。

除了原因之外,我在启动和运行工具包时遇到了一些麻烦。该工具包没有任何文档;只有一组六个DLL文件(在一个目录中),以及一组四个MATLAB'.m'示例代码文件(在另一个目录中)。我过去使用的每个工具包都是内置工具包,或者具有直观(半自动)安装过程。

下载工具包后,我尝试的第一件事就是简单地运行一个'.M'示例代码。这失败了,因为代码的第一行包含函数 osc(),它当前没有被MATLAB识别。

所以,我想我可能需要将'.M'文件移动到与DLL相同的文件夹中;也许MATLAB会看到DLL中的函数。没有骰子。

所以,我意识到我必须以某种方式在启动时将MATLAB链接到DLL。我尝试将DLL添加到文件夹并在'pathdef.m'文件中添加一个条目。这也失败了。

我已经阅读过某些地方,我可以使用 loadlibrary()函数加载DLL文件。所以,我试着为DLL文件做这个。第一个文件失败了:

>> loadlibrary('osc_free_address.dll')

Error using loadlibrary>lFullPath (line 587)
Could not find file osc_free_address.h.

我开始用完选项了...如何启动并运行这组DLL?

5 个答案:

答案 0 :(得分:1)

如果您查看该软件的构建,它正在编译mex文件,而不是DLL(共享库):http://sourceforge.net/p/oscmex/code/4/tree/trunk/src/osc_make.m

我会尝试使用mex命令而不是dll命令(可能这些文件只是错误命名。)更好的是,我会使用mex在源代码中使用构建文件自行编译文件。

请注意,说明书还说您需要liblo-0.22才能运行库,因此请确保您也可以访问它。

答案 1 :(得分:1)

浏览此库的web page似乎这些DLL只是{strong>旧格式的mex个文件。
因此,他们应该在共享库的上下文中使用(例如,使用loadlibrarycalllib),而是直接编译为mex文件。

为此,我建议采取以下步骤:

  1. 确保为Matlab配置了一个有效的mex编译器 在matlab中,输入:

    >> mex -setup
    

    这将指导您完成配置过程。我知道你正在使用Windows机器,我通常使用visual studio编译器 - 最适合我。

  2. 该库的README文件表明OSC

      

    需要liblo 0.22或更高版本。见http://plugin.org.uk/liblo/

    确保您拥有此库,并且该库位于您LD_LIBRARY_PATH中(有关详情,请参阅this questionmex docs)。

  3. their repository获取OSC库的代码。

  4. 使用

    在matlab中编译源代码
    >> mex -O -largeArrayDims osc_free_address.c
    >> mex -O -largeArrayDims osc_free_server.c
    
    所有7个c源文件的

    等等。在输入c文件之后,你将拥有可以从Matlab运行的mex文件,就像它们是常规功能一样。
    根据Andrew Mao的建议,您可能会发现使用library's make file很有用。

  5. 祝你好运,

答案 2 :(得分:0)

我看了一下你的OSC工具包。它们似乎是由MATLAB mex编译的。但是,没有提到它们构建的是哪种架构。您可以在MATLAB命令提示符下键入mexext以查找MATLAB mex文件的扩展名。然后,将DLL扩展名更改为给定的扩展名。如果原始mex与您的matlab兼容,则可以通过MATLAB轻松访问DLL。只需确保将文件夹添加到MATLAB路径中。

答案 3 :(得分:0)

尝试将扩展名从.dll更改为.mexw32(在win32中)或.wexw64(在win64中)。这是一个很长的镜头,但它可能会奏效。

答案 4 :(得分:-1)

无法直接使用共享库。如您所述,您需要使用loadlibrary将它们加载到MATLAB中。根据文档,loadlibrary有两个参数(至少)。第一个参数是文件的名称,第二个参数是包含函数和外部变量定义的头文件。如果您不提供头文件,MATLAB将查找与DLL同名的文件。话虽如此,您需要访问头文件,或者至少如果您知道函数的外观,则需要为DLL编写头文件。

我在MATLAB中使用过DLL。只要涉及DLL,MATLAB就不是非常用户友好的。特别是,如果DLL是用C(或C ++)以外的语言编写的,那么将函数加载到MATLAB中会很困难。

此外,MATLAB只能支持某些特定的DLL。基于您的MATLAB版本,您需要确定MATLAB是否支持共享库。看看Here

简而言之,将DLL加载到MATLAB中并不容易。您需要从DLL获得一些信息。