5

我正在尝试从 MATLAB 工具包“ oscmex ”中执行一些示例代码。该工具包允许通过 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?

4

5 回答 5

1

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

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

  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. 从他们的存储库中获取OSC 库的代码。

  4. 使用 matlab 编译源代码

    >> mex -O -largeArrayDims osc_free_address.c
    >> mex -O -largeArrayDims osc_free_server.c
    

    对于所有 7 个 c 源文件,依此类推。在对 c 文件进行混合后,您将拥有可以从 Matlab 运行的 mex 文件,就好像它们是常规函数一样。正如 Andrew Mao 所建议的,您可能会发现使用库的 make 文件
    很有用。

祝你好运,

于 2013-02-12T06:45:06.667 回答
1

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

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

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

于 2013-02-11T17:42:50.610 回答
0

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

于 2013-02-13T12:19:31.190 回答
0

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

于 2013-02-12T05:53:46.643 回答
-1

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

我在 MATLAB 中使用过 DLL。只要涉及到 DLL,MATLAB 就不是很友好。特别是,如果 DLL 是用 C(或 C++)以外的语言编写的,您将无法将函数加载到 MATLAB 中。

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

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

于 2013-02-12T05:14:12.840 回答