MacでRcppを動かしたい
珍しく続けて更新。
R言語上級ハンドブックを使った勉強会をしてまして、躓いたところを補完しておきます。
環境
MacOSX10.9 Marvericks、Xcode 5.0.1の上でThe R Project for Statistical Computingで配布されているR 3.0.2 binary for Mac OS Xを動かしてる。
C++のコードをコンパイルしようとするとエラー
Chapter1 section13 「S4/Refference ClassをRcppで生成する」ではC++のソースをコンパイルしてRで使おうっていう章でテキストは以下のような流れ。
> install.packages(c("inline", "Rcpp")) > library(inline) > library(Rcpp) > inc <- ' using namespace Rcpp; using namespace std; class Student { :(中略) } ' > mod_std <- cxxfunction(signature(),plugin="Rcpp",includes=inc) > mod_student <- Module("mod_student", getDynLib(mod_std)) > Student <- mod_student$Student > student1 <- new (Student, 18, "Taro")
incにコードが入ってて、それをcxxfunctionでコンパイルしたい。
だがしかし、cxxfunctionを実行すると、
以下にエラー dyn.load(libLFile) : 共有ライブラリ '/var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so' を読み込めません: dlopen(/var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so, 6): Symbol not found: __Z8demangleRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE Referenced from: /var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so Expected in: flat namespace in /var/folders/9r/x2b16sds2l30w0tds8p29k740000gn/T//RtmpbtB1sk/filed517926b08c.so
なんかのダイナミックライブラリが読み込めてないって怒られる。
調べてみたところ、Rをコンパイルした環境と使ってる環境が違うんじゃないかって話で、具体的にはRはlvm-gcc 4.2を使ってコンパイルされてて、MacOSXのコンパイラがclang++なのが問題っぽい。
Rをコンパイルすればいい
手っ取り早く解決するためにRをコンパイルすることにした。とはいってもソース落としてきたりするのは面倒なのでhomebrew*1で一発解決。
$ brew install R
このRは/usr/local/bin/にインストールされる*2。先にあったバイナリ版のRは/usr/bin/Rにシンボリックリンクがあるのでこれを消して新しくbrew版のRのリンクを置いておく。これでRStudioからも見える。
$ rm /usr/bin/R $ ln -s /usr/local/bin/R /usr/bin
Windows環境で出るエラーについて
以下のような別のエラーが出てて
Error in compileCode(f, code, language = language, verbose = verbose) : Compilation ERROR, function(s)/method(s) not created! In addition: Warning message: running command 'C:/PROGRA~1/R/R-30~1.2/bin/x64/R CMD SHLIB file156c720a4197.cpp 2> file156c720a4197.cpp.err.txt' had status 1
ざっと調べたところfortranのコンパイラが足りないとかなんとか。とりあえずいろいろ導入してくれるRTools(http://cran.r-project.org/bin/windows/Rtools/)っていうのを入れるといいらしい。Rcpp・inlineパッケージを使ってC++とRを連携させる - My Life as a Mock Quantに詳しく書いてあったので見てみるといいかもしれません。
*1:homebrewのインストールと使い方はHomebrewの使い方 - maruko2 Note.とかを参考に。
*2:本当は/usr/local/Cellar/r/3.0.2/bin/Rにあるけどわかりやすいからこっちで