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 とは何の関係もありません( Rcppについては、単独での使用、パッケージでの使用、インラインでの使用に関する十分なドキュメントも提供しています...)。

JSON 解析機能を使用しているようですが、含まれているヘッダーに対応する JSON パーサー ライブラリにリンクしていないようjson/json.hです。

この質問はコード例が不完全で再現できないことを除けば、ここに2つの問題があります。

  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 に答える