0

基于本教程 - 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 无法链接其余的头文件。

我该如何解决?

4

2 回答 2

3

这与Rcpp 无关(为此,我们还提供了关于单独使用、在包中、通过内联......)的大量文档。

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

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

  1. 使用库学习有关 C/C++ 程序的技巧,以及

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

当您根据标头使用 JSON 和 Curl 时,您可以(并且可能应该)研究相应的包,如RJSONIORCurl

如果您知道那里发生了什么并了解其中的机制,那么您可以使用Rcpp来提供您正在寻找的新功能。但仅仅通过将Rcpp加入其中,这些问题并不能自行解决。您需要了解如何包含头文件和链接库。

于 2012-12-16T13:24:33.387 回答
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 存储。 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 标志来完成。

于 2012-12-18T03:24:49.260 回答