2012-12-16 66 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標誌來完成。