[英]Error calling C++ function from R - library loads, but function is not on the table
这是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上发生的。
这是因为您正在使用a.cpp
; C ++函数名称被编译器“破坏”。 您可以将相同的代码与文件名ac
,像以前一样对其进行编译,然后从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
如果不将参数强制转换为正确的类型,则可能会进行复制,以使您的原始值不变。 如果使用.C()
强制将值强制为整数,则将得到预期的结果:
> dyn.load("a.so")
> .C("double_me", x = as.integer(2))
$x
[1] 4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.