无法在R中加载C共享库

时间:2014-07-22 10:51:40

标签: c++ c r rcpp

我尝试在Windows中从C拨打R代码double_metaphone.c。我熟悉R,但还没有尝试过C。

我已使用Cygwin gcc编译代码并在Windows中创建了一个共享库,包括头文件double_metaphone.h

gcc -c double_metaphone.c
gcc -shared -o double_metaphone.dll double_metaphone.o

我已使用dyn.load加载dll文件,如下所示

dyn.load("C:/R/double_metaphone.dll")

getLoadedDLLs()列出了double_metaphone.dll,但是

is.loaded(double_metaphone.dll)

给出错误

Error in is.loaded(double_metaphone.dll) : 
  object 'double_metaphone.dll' not found

当我尝试使用.C().Call()时,我会

Error in .C("double_metaphone") : 
  C symbol name "double_metaphone" not in load table

我理解这是C ++代码的问题,如Link1Link,但为什么我无法访问共享库以从R调用C代码?我哪里错了?

2 个答案:

答案 0 :(得分:1)

按照我的理解" is.loaded"检查加载的符号。根据标题,您可以尝试:

is.loaded("DoubleMetaphone")

调用方法。尝试:

.C("DoubleMetaphone", <your>, <arguments>)

答案 1 :(得分:1)

您需要编译并链接R以使shared object可加载。 e.g。

$ gcc -I/YOUR_R_HOME_DIR/include -DNDEBUG -fpic -c double_metaphone.c -o double_metaphone.o

$ gcc -shared -o double_metaphone.dll double_metaphone.o -L/YOUR_R_HOME_DIR/lib -lR

或者只是

$ R CMD SHLIB double_metaphone.c

正如Dirk所说,R-exts为您提供了更多详细信息。

你想考虑 Rcpp 来编写R中的编译代码,这将使你在未来的道路上受益。