在R包中包含已编译的共享C库,并从R包装函数中调用其中的函数

时间:2017-10-24 17:18:03

标签: r dll package

我有一个已编译的C库(lib.dll),我希望将其包含在我的R包中,以便我为该包编写的几个R函数可以通过.Call访问lib.dll的函数。我在包中没有其他的C源代码,并且lib.dll的源代码与包一起构建不是一个选项。

在我的包中包含lib.dll的规范方法是什么?请注意,我不打算将我的包提交给CRAN,所以CRAN关于编译代码的规则对我来说并不重要,但我确实希望最终在其他一些在线源上提供该包,所以总是手动添加dll之后包安装不是最佳的。我觉得这样做有“正常”的方式,但我似乎无法让它发挥作用。

我尝试过的是:

  • 将dll放入src文件夹并将useDynLib(lib)添加到NAMESPACE文件中,但这会在构建程序包时导致问题

  • 由于缺少更好的解决方案,我尝试将dll添加到已经构建的包中,并包含一个.onLoad和.onAttach函数(在zzz.R中),它使用library.dynam动态加载dll( );这似乎最初工作,我可以在加载pakcage后直接使用.Call()访问lib.dll的函数,但是当我尝试通过我的R包装器函数访问它们时,我被告知dll的函数不在命名空间中;我在这里不知所措,我的理解是将useDynLib()行添加到NAMESPACE文件中是为了使用包来编译dll

1 个答案:

答案 0 :(得分:1)

如果有人有同样的问题,答案很简单,并且在“Writing R Extensions”手册中明确表示:

“inst子目录的内容将被递归复制到安装目录.inst的子目录不应该干扰R使用的那些(当前,R,数据,演示,exec,libs,man,help,html和Meta ,早期版本使用latex,R-ex)。“ 因此dll和其他文件可以简单地放入/ inst并最终放入已安装的软件包中。