2

最近、Amazon から 2013 Rcpp の本をダウンロードして、R コードで C++ をより適切に使用する方法を学びました。最初のフィボナッチ再帰関数とラッパーを使用して最初のコンパイル例を試して、それができるかどうかを確認しています。私は最新のRでUbuntuを使用しています。

まず私のC ++:

    /* Cpp based recurive function */
int fibonacci(const int x){
  if(x == 0) return(0);
  if(x == 1) return(1);
  return(fibonacci(x - 1) + fibonacci(x - 2));
}


/* Wrapper */
extern "C" SEXP fibWrapper(SEXP xs) {
  int x = Rcpp::as<int>(xs);
  int fib = fibonacci(x);
  return(Rcpp::wrap(fib));
}

次に、sh を起動して次のように入力します。

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'`
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'`
R CMD SHLIB Fibonacci.cpp

しかし、私は得る:

g++ -I/usr/share/R/include -DNDEBUG      -fpic  -O3 -pipe  -g  -c Fibonacci.cpp -o Fibonacci.o
Fibbonacci.cpp:10:12: error: 'SEXP' does not name a type
make: *** [Fibonacci.o] Error 1

C++ コードに include ディレクティブが必要かもしれないので、もう一度実行しますが、今回#include<Rcpp.h>は C++ ファイルの先頭で、sh で同じコマンドをもう一度実行しますが、それでも喜びはありません。

g++ -I/usr/share/R/include -DNDEBUG      -fpic  -O3 -pipe  -g  -c Fibonacci.cpp -o Fibonacci.o
Fibonacci.cpp:1:18: fatal error: Rcpp.h: No such file or directory
compilation terminated.
make: *** [Fibbonacci.o] Error 1

私は何を間違えましたか?sh で設定した値をクエリすると、次のようになります。

$PKG_CXXFLAGS
sh: 9: -I/local/yrq12edu/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include: not found
$PKG_LIBS
sh: 10: -L/local/yrq12edu/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/lib: not found

しかし、ディレクトリに移動するとファイルが存在するため、見つからないメッセージは -L フラグが原因だと思います。

ありがとう、ベン。

4

2 に答える 2

4

重要な詳細を見落としているようです。あなたがするとき

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'`
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'`
R CMD SHLIB Fibonacci.cpp

最初の 2 つの結果をシェルに割り当ててエクスポートする必要があります。ここで行うことは、「割り当てて忘れる」ことです。

これを示しているリスト 2.1 で見落としていたのは (または、電子ブックが削除されたのかもしれません。私は電子ブックを持っていません)、非常に重要な末尾のバックスラッシュです。

PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` \
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'`  \
R CMD SHLIB Fibonacci.cpp

これで、割り当ては R (シェル スクリプト自体) の呼び出しと同じ実行で行われ、値があり、g++ の呼び出しでそれらが渡されます。

次の 2 行で、必要なすべての -I および -L 部分を含む結果のコマンドを完全に引用していることがわかります。したがって、両方 (コンパイルとリンクのステップ) が複数の行にまたがります。

したがって、この本は正しく、示されている方法で実行すれば、これはすべて機能します。インライン (この章で後述) と属性 (これも同じ章で後述) はどちらも、基本的にPKG_CXXFLAGSとのPKG_LIBS割り当てを行います。

編集:また、あなたのテストは間違っています。あなたが言いたかったのはこういうことだったのかもしれません

$ PKG_CXXFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'`
$ echo $PKG_CXXFLAGS
-I/usr/local/lib/R/site-library/Rcpp/include
$ 

シェル変数を「呼び出す」ことはできないため、「見つからない」という回答が得られました。

編集 2: いずれにせよ、あなたが試した例は、セクション 2.4 の残りの議論を動機付けるために実際にそこにあるだけです.および属性。どちらもはるかに優れています。それらを使用します。

于 2013-10-02T20:51:14.223 に答える
1

R をどのようにインストールしましたか? R ヘッダーが欠落しているようです。r-base-devおそらく、パッケージをインストールする必要があります。

コードについては、ラッパーは必要ありません。.cppこれをファイルに入れるだけです:

#include <Rcpp.h>
using namespace Rcpp ;

// [[Rcpp::export]]
int fibonacci(const int x){
  if(x == 0) return(0);
  if(x == 1) return(1);
  return(fibonacci(x - 1) + fibonacci(x - 2));
}

そしてsourceCppこのファイルだけ:

> sourceCpp( "fib.cpp" )
> fibonacci(6)
[1] 8
于 2013-10-02T17:42:31.140 に答える