【发布时间】:2017-07-22 22:15:29
【问题描述】:
我正在尝试实现 R 与 C 的简单集成。最初它很简单:我想通过 .C 或 .Call 函数将值从 R 传递到内置于 .o 共享库中的 C 函数。 C 函数应该简单地打印通过 printf 传入的值。
这是我的.Call 方法:
.Call("test", as.integer(5), as.character("A"), as.character("string_test"))
还有我的 C 代码:
#include <stdio.h>
void test(int integer, char character, char **str) {
printf("Integer: %i\nChar: %c\nString: %s\n", integer, character, *str);
}
但是当我通过控制台从 R 调用 C 函数(RStudio 崩溃)并启用 gdb 时,我收到:
Integer: 1466480376
Char: �
Float: -100407552.000000
String:
***caught segfault ***
address 0x20000090, cause 'memory not mapped'
Traceback:
1: .Call("test", as.integer(5), as.character("A"), as.character("string_test"))
好像还不够,我们可以看到传入的值打印得很奇怪。
我所做的详细信息,一步一步:
我用gcc构建了.o共享库:
gcc -shared -o func_teste.o -fPIC func_teste.c
并准备在R环境中动态加载:
$ R CMD SHLIB func_teste.o
gcc -m64 -I/usr/include/R -DNDEBUG -I/usr/local/include -fpic -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic -c func_teste.c -o func_teste.o
gcc -m64 -shared -L/usr/lib64/R/lib -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -o func_teste.so func_teste.o -L/usr/lib64/R/lib -lR
最后,在 R 控制台中,我运行了:
>dyn.load('func_teste.o')
>.Call("test", as.integer(5), as.character("A"), as.character("string_test"))
有人知道为什么会这样吗?
【问题讨论】:
-
看起来 GNU(或 R 团队)提供了出色的文档。另见Writing R Extensions。更一般地,请参阅The R Manuals。我有点羡慕文档有多好。
-
OP 似乎将
.C()调用约定与.Call()用法混淆了。
标签: c r linux segmentation-fault