【问题标题】:Including compiled shared C library in R package and calling functions in it from R wrapper functions在 R 包中包含已编译的共享 C 库并从 R 包装函数调用其中的函数
【发布时间】: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 的源代码与包一起构建不是一种选择” — 好奇。介意解释为什么?因为如果是这种情况,这(负面)当然会影响可分配性。

标签: r dll package


【解决方案1】:

如果有人有同样的问题,答案很简单,并且在“编写 R 扩展”手册中给出了明确的说明:

"inst子目录的内容会递归复制到安装目录下,inst子目录不应该干扰R使用的子目录(目前是R、data、demo、exec、libs、man、help、html和Meta ,早期版本使用乳胶,R-ex)。” 因此 dll 和其他文件可以简单地放入 /inst 并最终在安装的包中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多