【问题标题】:Setting a directory path to a dynamically linked library in an R package将目录路径设置为 R 包中的动态链接库
【发布时间】:2016-09-07 01:55:08
【问题描述】:

在编写 R 包时,加载动态链接库(即.so 文件)的正确方法是什么?到目前为止,唯一对我有用的解决方案是指定 .so 文件的完整路径,例如:

dyn.load('/FULL/PATH/TO/MY/R_PACKAGE/src/my_file.so')

显然,这种方法不适用于 CRAN/Bioconductor 提交,因为无法找到 .so 文件。因此,我(未成功)尝试了以下替代方案:

1) library.dynam()

2)library.dynam('my_file.so')

3)library.dynam('my_file.so', 'R_PACKAGE')

4) system.file("src", "my_file.so", package = "R_PACKAGE")

相关链接:R: C symbol not in load tableR: C symbol name not in load table - error in linking with external .c files

为了清楚起见,我的 R 包的用户显然可以在他们的计算机上设置任意工作目录。完整路径方法(如上所示)唯一可行的方法是将其工作目录设置为/FULL/PATH/TO/MY/R_PACKAGE/src,这(当然)是不切实际的。

【问题讨论】:

    标签: c r dll


    【解决方案1】:

    Writing R Extensions 中所述,执行此操作的标准方法是:

    1.5.4 useDynLib

    NAMESPACE 文件可以包含一个或多个 useDynLib 指令,这些指令允许需要加载的共享对象。* 指令

    useDynLib(foo)

    注册共享对象foo** 以使用library.dynam 加载。注册对象的加载发生在加载包代码之后和运行加载挂钩函数之前。只需要加载挂钩函数来加载共享对象的包可以改用useDynLib 指令。

    * 注意:只有当包在 R 目录中包含 R 代码时,才会在所有版本的 R 中读取。 ** 请注意,这是共享对象的基本名称,并且会添加适当的扩展名(.so 或 .dll)。

    【讨论】:

      【解决方案2】:

      快速点:

      • 为什么需要发送.so 文件?这将阻止上传到不接受二进制内容的常见存储库(如 CRAN)

      • 您可以使用system.file("src", "my_file.so", package="R_PACKAGE") 计算完整的/FULL/PATH/TO/MY/R_PACKAGE/src/my_file.so(但请确保您实际安装了非标准的src/

      • 所有其他情况(正如@BenBolker 指出的那样)R 将知道如何创建动态库并为您加载它。每个带有编译代码的包都会这样做。只需将您的源代码放入src/,您就(基本上)完成了。

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 2016-12-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 2014-04-07
        • 1970-01-01
        相关资源
        最近更新 更多