【问题标题】:Building R package with C code, dll missing用 C 代码构建 R 包,缺少 dll
【发布时间】:2015-02-02 15:12:46
【问题描述】:

我正在尝试构建一个 R 包,它通过 .Call 调用一些 C 子例程。

如果我手动执行 R CMD SHLIB 然后 dyn.load .dll 文件,所有功能都可以正常工作。

现在,我正在使用 R CMD build 构建包。

我将所有 C 代码以及我正在添加的一些库的 .h 文件放在 src 文件夹中。当我运行 R CMD build NAMEPACKAGE 时,一切似乎都很好,但是当我运行 R CMD check NAMEPACKAGE 时,我收到以下错误:

*** arch - i386
Error in library.dynam(lib, package, package.lib) : 
  DLL 'NAMEFUNC' not found: maybe not installed for this architecture?
Error: loading failed
Execution halted
*** arch - x64
Error in library.dynam(lib, package, package.lib) : 
  DLL 'NAMEFUNC' not found: maybe not installed for this architecture?
Error: loading failed
Execution halted
ERROR: loading failed for 'i386', 'x64'

我试图在互联网上获取一些信息,我觉得我应该编写一个 Makevars 文件,但老实说,我在编写 R 扩展教程 (1.2.1) 上花了很多时间,我真的努力理解我到底需要做什么。 有人可以向我解释如何解决这个问题吗?考虑一下我想将我的包裹提交给 CRAN。谢谢。

【问题讨论】:

  • 你的 C 代码在你的包的src 目录中还是只有 dll ?
  • 其实我只有c代码,我以为我明白了,出于可移植性的原因,我以前不必编译c代码,否则dll应该只对我自己的操作系统...还是我错了?
  • 你是对的,有趣的是,如果构建工作正常,检查会给出这些错误。鉴于你打算提交给 CRAN,你愿意把它放在 github 上吗?如果我们可以查看您的包结构和文件(如 NAMESPACE),则故障排除会更容易。
  • 感谢您对 cdeterman 的帮助,实际上我刚刚发现了问题所在!这(像往常一样)是一件相当愚蠢的事情,我不知道即使你用某个名称调用某个函数,关联的 dll 也会自动使用包的名称而不是函数本身的名称来调用,就像它相反,当您通过 R CMD SHLIB 创建 dll 时会发生这种情况。
  • 很高兴您解决了问题。您应该将其作为答案放在下面,并在可能的情况下接受它,以便其他人知道问题已解决。

标签: c r dll package


【解决方案1】:

我刚刚发现问题出在哪里!这(像往常一样)是一件相当愚蠢的事情,我不知道即使你用某个名称调用某个函数,关联的 dll 也会自动使用包的名称而不是函数本身的名称来调用,就像它相反,当您通过 R CMD SHLIB 创建 dll 时会发生这种情况。 因此,在 NAMESPACE 中,我不得不添加 useDynLib(NAMEOFPACKAGE) 而不是 useDynLib(NAMEOFFUNCTION)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多