10

-std=c++0xインラインでRcppを使用して設定したい。

インラインパッケージを使用しているときにR:C ++最適化フラグが表示されましたが、システム全体に変更を加えたくないので、Dirkの回答でオプション2を試していました。

私は試した:

settings=getPlugin("Rcpp")
settings$Makevars[length(settings$Makevars)+1] = "CXXFLAGS = $(CXXFLAGS) -std=c++0x"
fun=cxxfunction(signature(x_ ="numeric"),src,plugin="Rcpp",settings=settings,verbose=2);

しかし、詳細な出力は、それがそれを無視していることを示しています。CFLAGSも試してみましたが、既存の値は含まれていませんが、効果はありません。

4

1 に答える 1

10

いくつかのソースコードの研究とDirkEddelbuettelからのヒントの後、私はこれを解決しました:

settings$env$PKG_CXXFLAGS='-std=c++0x'

PKG_CPPFLAGS同じように設定できます。

完全でより堅牢な例を次に示します。

library(inline)

src='
using namespace Rcpp;
std::vector<const char*> test={"Hello","World","!!!"};
return wrap(test);
'

settings=getPlugin("Rcpp")
settings$env$PKG_CXXFLAGS=paste('-std=c++0x',settings$env$PKG_CXXFLAGS,sep=' ')
fun=cxxfunction(signature(),src,plugin="Rcpp",settings=settings)

Sys.unsetenv('PKG_CXXFLAGS')

print(fun())

プラグインにすでに設定があったpaste()場合は、それらが保持されていることを確認します。

これunsetenv()cxxfunctionすでにやるべきことです(IMHO)。現在、環境に変数を追加しますが、後で削除することはありません。したがって、unsetenv()呼び出しなしで、後でcxxfunction再度実行した場合でも、すべてのデフォルトを使用すると、CXXFLAGS以前に設定したものが使用されます。これは問題ではないかもしれませんし、驚くべき結果をもたらすかもしれません。PKG_CXXFLAGS(自分のコードを設定-Wall -Werrorするために使用していたが、後でコードがサードパーティのライブラリにリンクし、それらのオプションでコンパイルすることを拒否した場合を想像してみてください。)

于 2011-08-24T04:48:29.357 に答える