Posted at

RStanのインストール時に C++14 standard requested but CXX14 is not defined と怒られた時の対処


はじめに

友人がRStanの環境作りにはまり、それを解決する日本語の記事が見当たらなかったのでここに残しておきます。


環境

OS:Windows8

R:3.5.1

RStdio:1.1

Rtools:3.4 (g++:4.9.3)

RStan:2.17.3


インストール手順

基本的には以下のURLに従って進めます。

RStan Getting Started (Japanese)

しかし、RStanのインストールまで済ませてモデルのフィッティングを行う以下のコードを実行すると


console

fit <- stan(file = '8schools.stan', data = schools_dat,

iter = 1000, chains = 4)

次のエラーが出て終了しました。

Error in compileCode(f, code, language = language, verbose = verbose) :

Compilation ERROR, function(s)/method(s) not created! Error in .shlib_internal(commandArgs(TRUE)) :
C++14 standard requested but CXX14 is not defined


原因

RToolsによってインストールされるg++のバージョンが4.9.3だったのですが、RからC++14を要求されているらしく、4.9.3のバージョンでは実行時にオプションをつけないとc++14を利用できないことが原因でした。


対処

結果的には、以下のURLに従って ~/.R/Makevars ファイルを生成することで無事にエラーを解消することができました。

Installing RStan on Windows

このページ内の以下のコードをコンソールで実行することによって解決できました。


console

dotR <- file.path(Sys.getenv("HOME"), ".R")

if (!file.exists(dotR))
dir.create(dotR)
M <- file.path(dotR, "Makevars")
if (!file.exists(M))
file.create(M)
cat("\nCXX14FLAGS=-O3 -Wno-unused-variable -Wno-unused-function",
"CXX14 = g++ -std=c++1y",
file = M, sep = "\n", append = TRUE)

このコードでは、~/.R/に以下のMakevarsファイルを生成します。


Makevars


CXX14FLAGS=-O3 -Wno-unused-variable -Wno-unused-function
CXX14 = g++ -std=c++1y


Rのコードの実行時にMakevarsにC++のコンパイルコマンドを読みにくるようです。

今回引っかかったのはC++14の利用だったので、最適化オプションであるCXXFLAGSは無くてもいいかもしれません(まああったほうがいいとは思います)。


もう一つ引っかかったこと

実は上のコンソールコマンドを実行する時にSys.getenv("HOME")でホームディレクトリが正しく取得できなかったのですが、これはユーザー名を日本語にしていたためパスに日本語が含まれていたことが原因でした。変えるのにレジストリいじる必要があってとてもめんどくさかったのでwindowsは悪(過激派)(ごめんなさい)