【问题标题】:Linking MATLAB to a DLL library将 MATLAB 链接到 DLL 库
【发布时间】:2013-01-25 05:27:33
【问题描述】:

我正在尝试从 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?

【问题讨论】:

标签: matlab dll


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        浏览这个库的web page 似乎这些DLL 只是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 question 了解详细信息,或mex docs)。

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

        4. 使用matlab编译源码

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

          以此类推,适用于所有 7 个 c 源文件。在对 c 文件进行 mex 处理后,您将拥有可以从 Matlab 运行的 mex 文件,就好像它们是常规函数一样。
          按照 Andrew Mao 的建议,您可能会发现使用 library's make file 很有用。

        祝你好运,

        【讨论】:

        • loadlibrary 应该可以工作。 mex 也可以,但不是问题的答案。
        • @Ono - 什么?你能说得更具体点吗?
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2020-06-05
          • 1970-01-01
          • 2015-08-24
          • 1970-01-01
          • 2011-06-11
          • 2022-01-02
          • 2018-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多