使用预编译的共享库构建R包

时间:2012-12-24 17:18:06

标签: r dll package shared-libraries

我正面临着我正在编写的R包的问题,​​并尝试使用预编译的共享库进行构建。让我试着简要描述一下这个问题:

  • 这个包(我们称之为mypack)依赖于已编译的共享库mylib.dll,并且在构建R包时无法动态编译。
  • mylib.dll已在Windows下的x64计算机上编译,可以使用dyn.load加载到R中。
  • 包中包含所需的文件NAMESPACE,其中指定了useDynLib(mylib.dll)。包含指令.onLoad的函数library.dynam('mylib.dll', pkg, lib)也在文件zzz.R中指定。
  • 使用常规命令mypack使用Rtools构建R包Rcmd INSTALL,然后添加目录libs,保存mylib.dll。< / LI>
  • 当我尝试使用library(mypack)在R中加载包时,收到以下错误消息:
    Error: package 'mypack' is not installed for 'arch=x64'

这令我感到困惑。为什么共享库可以在R中顺利加载,但是当我使用它构建一个包时,我收到这个奇怪的错误消息?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

该错误消息来自library中的此代码:

 if (nzchar(r_arch) && file.exists(file.path(pkgpath, 
            "libs")) && !file.exists(file.path(pkgpath, "libs", 
            r_arch))) 
            stop(gettextf("package %s is not installed for 'arch=%s'", 
                sQuote(pkgname), r_arch), call. = FALSE, domain = NA)

告诉我你的构建包中需要一个{package} / libs / {arch}文件夹(即已安装的目录),其中{arch}与你的系统的arch相匹配,由r_arch <- .Platform$r_arch <给出/ p>

我猜你的构建未能正确完成。您的来源中是否有任何C代码?