共享库显然不包含任何例程

时间:2015-06-05 23:38:24

标签: r shared-libraries rcpp

我试图建立C++ library Faddeeva的R接口(各种类型的复杂错误函数);不幸的是,我在R中调用外部代码的经验很少,而且它证明是一个很大的挑战。

我天真的尝试,

R CMD SHLIB Faddeeva.cc

生成了一个共享库Faddeeva.so,我在R中加载

dyn.load("Faddeeva.so")
dlls <- getLoadedDLLs()
getDLLRegisteredRoutines(dlls[['Faddeeva']])

它是空的,我还没有注册任何功能。我相信我必须编写一些接口代码才能使用SEXP,以便我可以使用.Call接口(Rcpp可以让这一步更容易吗?),但是我仍然对这个共享库的原因感到困惑显示没有注册的例程。

欢迎任何有关进行此类项目的建议或指示!

编辑:感谢Dirk对Rcpp的回答和帮助,现在该界面已在Faddeeva package中实现。

1 个答案:

答案 0 :(得分:4)

我会退一步看看使用外部库的其他软件包。 oldie但goldie是RcppGSL,但是例如RcppRedis使用(C库)hiredis

真的没有深刻的魔力:

  1. 使用其他库中的头文件来声明标识符
  2. 编写一个简短的C ++文件来部署其中一个标识符
  3. 通过$em->persist($item); $em->flush($item); ldconfig -p | grep libraryname添加到src/Makevars,链接到其他库(应该在您的系统上可见 - 在Linux上PKG_LIBS)。
  4. 或者,如果您在包装中填写Johnson's Fadeeva的来源,只需将文件包含在src/中并跳过第3步。
  5. 请注意,我对Rcpp一无所知。它“仅”帮助第2点。其余部分与将C库链接到R扩展名相同。这可能是CRAN上的一千个不同包。

    如果您完全迷失了,请考虑the new list r-package-devel,但请先在Writing R Extensions中阅读一下。

    Jelmer的包裹nloptr包裹了约翰逊的另一个图书馆:nlopt。也许这可以作为灵感来帮助。我帮助了一点,使安装更有效率(通过使用系统libnlopt)。

    编辑:我仔细查看了page by Johnson。没有图书馆。只需.cc.hh。将这些内容放入您的软件包的src/,可能会重命名为.cpp.h - 您就完成了!

    编辑2:好的,我根据我刚才概述的食谱创建了一个小样本包。通过使用Rcpp,调用者变得像

    一样简单
    #include <Rcpp.h>
    using namespace Rcpp;
    
    #include "Faddeeva.h"
    
    // [[Rcpp::export]]
    double Dawson(double x) { // special case for real x
      return Faddeeva::Dawson(x);
    }
    

    我们可以像往常一样使用这个包:

    edd@max:/tmp$ Rscript -e 'library(RcppFaddeeva); Dawson(4.2)'
    [1] 0.122761
    edd@max:/tmp$ 
    

    我马上把它放在GitHub上。

    编辑3:现在是in this GitHub repo