无法在cpp文件中为Rcpp链接相关的头文件

时间:2012-12-16 11:43:53

标签: c r rcpp

基于本教程 - http://www.r-bloggers.com/using-r-callling-c-code-with-rcpp/ 我试图从R调用C函数 C代码具有以下依赖性,并且在编译C代码

之后它完美地工作
#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>

现在,当我尝试加载so文件时,我看到了以下错误。

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无法链接其余的头文件。

我该如何解决?

2 个答案:

答案 0 :(得分:3)

这与Rcpp无关(我们还提供 ample 文档,关于单独使用,在包中,通过内联,...)。

您似乎使用JSON解析功能,但显然没有链接到与您包含的标头json/json.h对应的JSON解析器库。

除了这个问题在代码示例中不完整且因此不可重现之外,我在这里看到两个问题:

  1. 使用库了解有关C / C ++程序的知识,

  2. 将此应用于R上下文。

  3. 当您根据标题使用JSON和Curl时,您可以(也可能应该)研究相应的包,例如RJSONIORCurl

    如果你知道那里发生了什么并理解了这些机制,那么你可以使用Rcpp来提供你正在寻找的新功能。但只是将Rcpp投入混合中,这些问题并没有解决。您需要了解包含标头和链接库的方式。

答案 1 :(得分: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标志来完成。