MATLAB与DLL库的链接

MATLAB与DLL库的链接,matlab,dll,Matlab,Dll,我正在尝试从MatlabToolkit“”中执行一些示例代码。该工具包允许通过MATLAB使用OSC协议进行通信。我认为这个问题是不具体的;它应该适用于以这种方式设置的任何工具箱 撇开原因不谈,我在启动和运行工具包时遇到了一些简单的问题。工具包没有任何文档;只有一组六个DLL文件(在一个目录中)和一组四个MATLAB“.m”示例代码文件(在另一个目录中)。我过去使用的每个工具包都是内置的,或者都有一个直观的(半自动)安装过程 下载工具包后,我尝试的第一件事就是简单地运行一个“.M”示例代码。这失

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

撇开原因不谈,我在启动和运行工具包时遇到了一些简单的问题。工具包没有任何文档;只有一组六个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?

如果您查看该软件的构建,它是在编译mex文件,而不是DLL(共享库):

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


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

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

我曾在MATLAB中使用DLL。就DLL而言,MATLAB的用户友好性不是很强。特别是,如果DLL是用C(或C++)以外的语言编写的,则在将函数加载到MATLAB中时会遇到问题

此外,MATLAB只能支持一些特定的DLL。根据您的MATLAB版本,您需要了解MATLAB是否支持共享库。看看


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

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

浏览此库的链接,这些DLL似乎只是文件的旧形式。
因此,它们不应在共享库的上下文中使用(例如,使用
loadlibrary
calllib
),而应直接编译为mex文件

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

  • 确保为您的Matlab配置了一个工作的mex编译器。
    在matlab中,键入:

    >> mex -setup
    
    这将指导您完成配置过程。我知道您在windows机器上工作,我通常使用visual studio编译器-最适合我

  • 该库的自述文件表明OSC

    需要liblo 0.22或更高版本。看

    确保您拥有此库,并且它位于您的
    LD\u library\u路径中
    (例如,有关详细信息,请参阅或)

  • 从中获取OSC库的源代码

  • 使用matlab编译源代码

    >> mex -O -largeArrayDims osc_free_address.c
    >> mex -O -largeArrayDims osc_free_server.c
    
    依此类推,以获取所有7个c源文件。在对c文件进行mex处理之后,您将拥有mex文件,可以从Matlab中运行,就像它们是常规函数一样。
    您可能会发现,如Andrew Mao所建议的,使用


  • 祝您好运,

    尝试将扩展名从.dll更改为.mexw32(在win32中)或.wexw64(在win32中)。这是一个很长的过程,但它可能会工作。

    这看起来像是在寻找dll的头文件。您通常熟悉
    mex
    文件和共享库之间的区别吗?如果不是,我将熟悉如何从matlab调用本机代码:。此外,请确保在您使用的代码中编译了适合于正确体系结构的DLL。不幸的是,工具箱包中没有包含头文件。工具箱可以在这里找到:loadlibrary应该可以工作。mex也可以,但不是问题的答案。@Ono-什么?你能说得更具体些吗?