【发布时间】:2017-10-24 17:18:03
【问题描述】:
我有一个已编译的 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( );起初这似乎可行,我可以在加载 pakcage 后直接使用 .Call() 访问 lib.dll 的函数,但是当我尝试通过我的 R 包装函数访问它们时,我被告知 dll 的函数不在命名空间中;我在这里不知所措,我的理解是在 NAMESPACE 文件中添加 useDynLib() 行是为了与包一起编译 dll
【问题讨论】:
-
“将 lib.dll 的源代码与包一起构建不是一种选择” — 好奇。介意解释为什么?因为如果是这种情况,这(负面)当然会影响可分配性。