MacBook Pro (Apple M1 Pro)にRcppをインストールする時のエラー対処方法
MacBook Pro (2021 Apple M1 Pro)にRcppをインストールした時に出たエラーを回避する方法について説明します。ただしエラーの原因は複数あって、これだけでうまく行く、というものではないです。以前MacBook ProのIntelチップを使っていた人、RStanをインストールしたことがある人、などによく起きるエラーだと思います。
エラー内容
Rcppのインストール自体はできて、ライブラリの読み込みもできる状態です。
install.packages("Rcpp")
library(Rcpp)
Rcppの関数を呼び出すとエラーが出ます。たとえばこんなコマンドでエラーが出ます。
Rcpp::cppFunction("
NumericMatrix cov_exp_quad(NumericVector xa, NumericVector xb, double sigma, double l) {
int n1 = xa.size();
int n2 = xb.size();
NumericMatrix K(n1, n2);
for (int i = 0; i < n1; ++i) {
for (int j = 0; j < n2; ++j) {
double diff = xa[i] - xb[j];
double exp_term = exp(-0.5 * pow(diff / l, 2));
K(i, j) = pow(sigma, 2) * exp_term;
}
}
return K;
}
")
どんなエラーかというと、メッセージはその都度変わるかもしれませんが、C++のコンパイラーがおかしい、というようなメッセージです。
using C++ compiler: ‘Apple clang version 16.0.0 (clang-1600.0.26.6)’
using SDK: ‘’
clang++ -arch x86_64 -ftemplate-depth-256 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I"/Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library/Rcpp/include" -I"/private/var/folders/sq/c6zzm0wj6nnfc7kw35xckkyh0000gn/T/Rtmp3l9BNH/sourceCpp-aarch64-apple-darwin20-1.0.13.1" -I/opt/R/arm64/include -fPIC "-mtune=native -O3 -Wall -pedantic -Wconversion" -c file65605ca9c844.cpp -o file65605ca9c844.o
error: unknown target CPU 'native -O3 -Wall -pedantic -Wconversion'
note: valid target CPU values are: i386, i486, winchip-c6, winchip2, c3, i586, pentium, pentium-mmx, pentiumpro, i686, pentium2, pentium3, pentium3m, pentium-m, c3-2, yonah, pentium4, pentium4m, prescott, nocona, core2, penryn, bonnell, atom, silvermont, slm, goldmont, goldmont-plus, tremont, nehalem, corei7, westmere, sandybridge, corei7-avx, ivybridge, core-avx-i, haswell, core-avx2, broadwell, skylake, skylake-avx512, skx, cascadelake, cooperlake, cannonlake, icelake-client, rocketlake, icelake-server, tigerlake, sapphirerapids, alderlake, raptorlake, meteorlake, sierraforest, grandridge, graniterapids, graniterapids-d, emeraldrapids, knl, knm, lakemont, k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, athlon-4, k8, athlon64, athlon-fx, opteron, k8-sse3, athlon64-sse3, opteron-sse3, amdfam10, barcelona, btver1, btver2, bdver1, bdver2, bdver3, bdver4, znver1, znver2, znver3, znver4, x86-64, geode
make: *** [file65605ca9c844.o] Error 1
Error in sourceCpp(code = code, env = env, rebuild = rebuild, cacheDir = cacheDir, :
Error 1 occurred building shared library.
回避方法
私の場合は非常にシンプルで、Makevarsファイルを消すだけでした。
rm ~/.R/Makevars
このファイルはRcppを実行する際の、g++やclang++などのコンパイラーを使いたい時に指定する設定ファイルです。下記のようなコマンドが入っています。
CC=/opt/local/bin/gcc-mp-4.7
CXX=/opt/local/bin/g++-mp-4.7
CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH
CXXFLAGS= -g0 -O3 -Wall
MAKE=make -j4
このファイル内で、Apple M1 Pro以外のチップで動くコンパイラーを指定してしまったのが原因で、起きていたエラーでした。
なぜ原因が分かったのか
最初はエラーメッセージのコマンドで検索してみましたが、全然分かりませんでした。例えば下記のようなあまり関係のないStack Overflowの記事が出てきました。
あまり関係のないことも書いてあって、パソコンの再起動とかRのバージョンアップとか試しましたが、直りませんでした。
結局公式のドキュメントに辿り着きました。
「2.1.4 その他の自分でインストールしたコンパイラを使いたい場合」という箇所があって、.R/Makevarsにコンパイラを指定することができる、という記述がありました。
そんなもの作った記憶はなかったけれども、念の為コマンドで調べてみました。そしたらありました。
ls -la ~/.R/
-rw-r--r-- 1 user_name staff 389B 12 25 2014 Makevars
日付を見たところ2014年のファイルでした。Apple M1のチップが発売されたのは2020年なので、関係ないファイルなのだろうと思いました。念の為バックアップファイルだけ作っておいて、Rcppのコマンドを再度実行したところ、問題なく動きました。
まとめ
Apple M1チップのMacBook ProでRcppの実行エラーが出た時の対処法について書きました。コンパイラ関係のエラーが出たら、一度Makevarsファイルがないかチェックしてみましょう。
ちなみにRcppを使いたかったのは、次のGausian Processの記事を再現してみたかったからです。無事こちらも実行することができました。