如何在R中与DLL进行接口交互?

4

我从Matlab创建了dll扩展。然后,我想在R中读取该dll。

我使用了dyn.load(),但它无法正常工作。

您能给我一些建议吗?


1
从我的角度来看,这似乎不太可能起作用。你想做什么?你可能能够在一些C代码中包装dll的调用,然后适当地链接并从R中调用... - Ben Bolker
3个回答

2

源代码是用哪种语言编写的?

问题在于混合使用编译器。Matlab dll 很可能是由Visual Studio构建的。你不能简单地在不同的编译器之间混合使用C++代码,因为函数标识符会被搞乱。如果经过一些工作,可以混合使用C对象代码。MinGW网站上有一些常见问题解答。


1

根据下面@Mario答案的评论讨论:我建议您尝试比较您所做的比较(R CMD SHLIB dll vs Matlab dll)以帮助诊断问题。根据结果,我认为您需要弄清楚在C中调用dll的语法,并编写一个小的C包装器来使用该语法,但反过来是可R CMD SHLIB的... R CMD SHLIB --help说您可以在命令行上包含链接器选项(即确保将您的Matlab可调用dll与您的R可调用dll链接),但我不确定精确的语法。研究R扩展手册的相关部分可能会有所帮助。


0

需要更多的信息。通常的做法是这样的:

dyn.load("/path/to/library");

一些要点:

  • 确保库的架构正确(例如,“x86_64”与“i386”与“armv7”)
  • 确保不要在基于Unix的机器上加载Windows的“dll”文件(“.so”,“.dylib”)

1
嗯,这真的能行吗?如果Matlab编译的dll没有正确的接口来从R调用,我会有点惊讶... 我想如果您确切地知道预期的调用协议(即所有变量的类型和顺序),那么它可能是可行的... 顺便说一句,对于原帖发布者:你能否提供更多关于“不起作用”意味着什么的信息?你尝试了什么,出现了什么错误消息...? - Ben Bolker
这是错误信息 dyn.load("sta.dll",F) # 全局加载错误 inDL(x, as.logical(local), as.logical(now), ...) : 无法加载共享对象 'C:/Users/grojas/Documents/sta.dll': LoadLibrary 失败: 找不到指定的模块。 - Guaner
file.exists("C:/Users/grojas/Documents/sta.dll") 是否等于 TRUE?(即,也许您只是没有正确设置工作目录?尝试使用 setwd([适当的目录])dyn.load(file.choose()) ?) - Ben Bolker
如果我使用 R CMD SHLIB 创建一个 DLL,我可以从 R 中读取它,但是如果我使用 Matlab 创建的 DLL,则无法从 R 中读取。 - Guaner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接