見出し画像

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の記事を再現してみたかったからです。無事こちらも実行することができました。



いいなと思ったら応援しよう!