2012-12-16 25 views
0

基于此教程链接 - http://www.r-bloggers.com/using-r-callling-c-code-with-rcpp/ 我试图从R. C代码调用C函数具有以下依存关系,并将其编译的C代码不能够依赖的头文件中的cpp文件RCPP

后完美的作品
#include <json/json.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <curl/curl.h> 
#include <time.h> 
#include <math.h> 
#include <Rcpp.h> 

现在,当我试图加载这样的文件,我看到下面的错误。

dyn.load("storage.so") 
Error in dyn.load("storage.so") : 
unable to load shared object '/home/algotree/Rcode/storage.so': 
/home/algotree/Rcode/storage.so: undefined symbol: json_object_array_length 

似乎R无法链接其余的头文件。

我该如何解决?

+1

为什么有人想今天链接标题...? – alk

回答

3

这有什么好做Rcpp(对此我们也提供了充足的文档有关其自己使用,在包装,通过行内,...)。

你似乎使用JSON-解析功能,但显然还没有链接到与您包含了头json/json.h一个JSON解析器库。

除了这个问题是在它的代码示例不完整的,因此不可复制的,我在这里看到两个问题:

  1. 了解C/C++程序使用库的绳索,并

  2. 申请这到了R环境。

当你使用JSON和卷曲根据你的头,你可以(并且可能应该)研究像RJSONIORCurl相应的软件包。

如果您知道是怎么回事那里了解的机制,就可以使用Rcpp提供你正在寻找新的功能。但仅仅通过投掷Rcpp就可以解决这些问题。您需要了解包含头文件和链接库的方式。

+0

你能指点我一个例子,他们已经将外部库链接到RCpp。对于在这种情况下链接库,我毫无头绪。 –

+1

请参阅CRAN上的Rcpp页面和使用它的90多个包。选择一个使用外部库的程序。并且/或者阅读我们为此特别写的** vignette **:http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-package.pdf –

+0

我发现一些软件包使用他们自己的个性化头文件保存在inst/headers文件夹中。我可以知道这些使用PKG_CPPFLAGS = -I ../inst/include在makevar文件中链接。但是当我给这个选项增加了一个PKG_CPPFLAGS = -I/usr/lib时,它就不工作了。我对这些链接完全陌生。请给我更多的指点。 –

0

这里是我如何解决这个问题,为了运行代码,我必须添加-lcurl和-ljson作为命令链接参数。因此,命令R CMD SHLIB应执行的命令是以下命令:

g ++ -I/usr/share/R/include -DNDEBUG -I/usr/local/lib/R/site-library/Rcpp/include -I/usr/include/-fpic -O3 -pipe -g -c storage.cpp -o storage.o g ++ -shared -o storage.so storage.o -L/usr/lib -L ​​/ usr/local/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/ usr/local/lib/R/site-library/Rcpp/lib -L ​​/ usr/lib64/R/lib -lcurl -ljson -lR

这可以通过编辑PKG_LIBS标志来完成。