从R调用C ++函数时出错-库加载,但函数不在表上

时间:2018-11-11 15:03:51

标签: c++ r dll

这是C代码:

// a.cpp
void double_me(int* x) {
  // takes a numeric input and doubles it
  *x = *x + *x;
}

我用

编译代码
>R CMD SHLIB a.cpp

之后,我运行R并键入以下命令:

 dinfo <- dyn.load("a.so")
 .C("double_me",x=2)

以错误结尾:“ double_me”不在列表中。

现在的问题是: dyn.load工作正常,dinfo包含:

  

DLL名称:文件名:/Users/myusername/a.so动态查找:TRUE

但是该函数不在表中

  

is.loaded(“ double_me”)    [1]虚假

怎么会发生?这是在macOS上发生的。

1 个答案:

答案 0 :(得分:3)

这是因为您正在使用a.cpp; C ++函数名称被编译器“破坏”。您可以将相同的代码与文件名a.c一起使用,像以前一样对其进行编译,然后从R中获取以下内容:

> dinfo <- dyn.load("a.so")
>  .C("double_me",x=2)
$x
[1] 2

或者,您也可以将此行添加到a.cpp的顶部:

extern "C" void double_me(int* x);

并从R中获取以下内容:

> dinfo <- dyn.load("a.so")
>  .C("double_me",x=2)
$x
[1] 2

更新:为什么结果高于2?

如果不将参数强制转换为正确的类型,则可以进行复制,以使原始值不会更改;如果在使用.C()时强制将值强制为整数,则会得到预期的结果:

> dyn.load("a.so")
> .C("double_me", x = as.integer(2))
$x
[1] 4