3

C++x11 コードで RInside を使用して R ルーチンを呼び出したいと考えています。デフォルトでは、R はライブラリの c++98 バージョンをインストールするように見えるため、リンクは成功しません。RInside の c++x11 バージョンをインストールするには、どのような手順を踏む必要があるのでしょうか (しかし、すべての R/R パッケージを再コンパイルする必要があると思いますよね?)。よろしくお願いします(私はMacOで作業しています)

更新: Rcpp と RInside を再インストールしました (私の Makevars は空なので、c++98 バージョンです)

 sudo R CMD INSTALL ~/Downloads/Rcpp_0.10.4.tar.gz 
 sudo R CMD INSTALL ~/Downloads/RInside_0.2.10.tar.gz

次に、 (no cx11) を使用して hello world の例をコンパイルします。

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp

それは私を生み出します:

  Hello, world!

ただし、x11 オプションを追加すると、次のようになります。

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o -stdlib=libc++ -std=c++11

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp -stdlib=libc++ -std=c++11

私は(リンクするとき)得ます:

  Undefined symbols for architecture x86_64:
   "RInside::parseEvalQ(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
  _main in testOut.cc.o
   "RInside::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
  _main in testOut.cc.o
   "Rcpp::Environment::assign(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, SEXPREC*) const", referenced from:
        bool Rcpp::Environment::assign<char [15]>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char const (&) [15]) const in testOut.cc.o

c++x11 オプションを使用して Rcpp および RInside を再コンパイルする場合

clang++ -I/Library/Frameworks/R.framework/Versions/2.15/Headers/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/include/ -I/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include/  -c ../src/Gui/test.cc -o testOut.cc.o -stdlib=libc++ -std=c++11

clang++ testOut.cc.o -o testOut -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/RInside/lib/x86_64 -L/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/lib/x86_64 -framework R -lRInside -lRcpp -stdlib=libc++ -std=c++11

好みは問題ありませんが、./test で seg fault が発生します。

追加:私のclangバージョンは次のとおりです:Apple clangバージョン4.1 (tags/Apple/clang-421.11.66)

4

2 に答える 2

3

R は ac コンパイラでコンパイルされます。パッケージをビルドするために必ずしも同じものを使用する必要はありません。そのため、clang を使用してアドオン パッケージをコンパイルすることは完全に有効です。~/.R/MakevarsパッケージにclangとC ++ 11を使用するために、ファイルにこれがあります:

CC=clang
CXX=clang++
CXXFLAGS= -stdlib=libc++ -std=c++11

また、Rcppの C++11 中心の再設計である Rcpp11 も参照してください。Rcpp の代わりに Rcpp11 を使用するように RInside をフォークすることは、おそらくそれほど難しくありません。

于 2013-10-16T13:01:44.880 に答える
0

さまざまなリンカー要件を認識していません。あなたが持っているものはうまくいくはずです。それ以外の場合は、実際のリンク手順とエラーを表示してください。できれば、私が最後に見ることができる再現可能な方法で。

以下を目撃してください。最初にデフォルトのフラグでビルドします:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic    # plain C++ 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
  -I/usr/local/lib/R/site-library/Rcpp/include \
  -I/usr/local/lib/R/site-library/RInside/include -g -O3 -Wall \
  -pipe -Wno-unused -pedantic -Wall   \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR  -lblas \
  -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
  -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
  -L/usr/local/lib/R/site-library/RInside/lib \
  -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
  -o rinside_sample0
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0 
Hello, world!       
edd@max:~/svn/rinside/pkg/inst/examples/standard$ 

今、私は単に私のに追加-std=c++11していCXXFLAGSます:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ grep ^CXXFLAGS ~/.R/Makevars 
CXXFLAGS=             -g -O3 -Wall -pipe -Wno-unused -pedantic -std=c++11
edd@max:~/svn/rinside/pkg/inst/examples/standard$  

バイナリを作り直します:

edd@max:~/svn/rinside/pkg/inst/examples/standard$ rm rinside_sample0  
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample0
ccache g++-4.7 -I/usr/share/R/include \
 -I/usr/local/lib/R/site-library/Rcpp/include \
 -I/usr/local/lib/R/site-library/RInside/include \
 -g -O3 -Wall -pipe -Wno-unused \
 -pedantic -std=c++11 -Wall  \
  rinside_sample0.cpp  -L/usr/lib/R/lib -lR \
 -lblas -llapack -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp \
 -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
 -L/usr/local/lib/R/site-library/RInside/lib \
 -lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
 -o rinside_sample0 
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample0    
Hello, world!        
edd@max:~/svn/rinside/pkg/inst/examples/standard$  

C++11 をデプロイするために、新しいコンパイラやプロジェクトは必要ありません。

コンパイラ フラグに 1 つのオプションを追加するだけです。これはとても簡単です。

さらにわかりやすくするために、次の 3 行を追加rinside_sample0.cppして C++11 プログラムにすることもできます。

auto magic = 42;                    // C++11 
R["magic"] = magic;                    
R.parseEvalQ("print(magic)");     

そして(必要な-std=c++11フラグを使用して)それもビルドして実行します。 C++ 11 対応コンパイラを使用してそれらを展開するために、Rcpp または RInside 側で厳密に変更する必要はありません。

于 2013-10-16T13:42:03.503 に答える