我正在尝试从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?
答案 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个文件。
因此,他们应该不在共享库的上下文中使用(例如,使用loadlibrary
和calllib
),而是直接编译为mex文件。
为此,我建议采取以下步骤:
确保为Matlab配置了一个有效的mex编译器 在matlab中,输入:
>> mex -setup
这将指导您完成配置过程。我知道你正在使用Windows机器,我通常使用visual studio编译器 - 最适合我。
该库的README文件表明OSC
需要liblo 0.22或更高版本。见http://plugin.org.uk/liblo/
确保您拥有此库,并且该库位于您LD_LIBRARY_PATH
中(有关详情,请参阅this question或mex docs)。
从their repository获取OSC库的源代码。
使用
在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很有用。
答案 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获得一些信息。