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

在R包中包含已编译的共享C库,并从R包装函数中调用其中的函数,r,dll,package,R,Dll,Package,我有一个已编译的C库(lib.dll),我想将其包含在我的R包中,以便我为包编写的几个R函数可以通过.Call访问lib.dll的函数。我在包中没有其他C源代码,并且不能选择随包生成lib.dll的源代码 在我的包中包含lib.dll的规范方法是什么?请注意,我不打算将我的包提交给CRAN,因此CRAN关于编译代码的规则对我来说并不重要,但我确实希望最终使包在其他一些在线源上可用,因此始终在包安装后手动添加dll将不是最佳选择。我觉得这样做是“正常”的,但我似乎无法让它发挥作用 我迄今为止所做的

我有一个已编译的C库(lib.dll),我想将其包含在我的R包中,以便我为包编写的几个R函数可以通过.Call访问lib.dll的函数。我在包中没有其他C源代码,并且不能选择随包生成lib.dll的源代码

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

我迄今为止所做的尝试:

  • 将dll放入src文件夹并将useDynLib(lib)添加到名称空间文件中,但这会在构建包的过程中导致问题

  • 由于缺乏更好的解决方案,我尝试将dll添加到已构建的包中,并包括一个.onLoad和.onAttach函数(在zzz.R中),该函数使用library.dynam()动态加载dll;这在一开始似乎是可行的,我可以在加载pakcage后直接使用.Call()访问lib.dll的函数,但当我尝试通过R包装函数访问它们时,我被告知dll的函数不在名称空间中;我在这里感到困惑,我的理解是将useDynLib()行添加到名称空间文件是为了让dll与包一起编译


如果有人有相同的问题,答案非常简单,在“编写R扩展”手册中给出了明确的答案:

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

“将lib.dll的源代码与软件包一起构建是不可取的”—好奇的。介意解释一下原因吗?因为如果是这样的话,这(负面)当然会影响可分配性。