2011-08-15 5 views
9

インラインでRcppを使用して-std=c++0xに設定します。Rcppとインラインを使用してg ++コンパイラフラグを設定するには?

私はR: C++ Optimization flag when using the inline packageを見ましたが、システム全体の変更をしたくないので、私は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で試してみましたが、既存の値は含めずに効果はありませんでした。

答えて

8

いくつかのソースコードの研究、およびダークEddelbuettelからヒントの後、私はこれを働いてきた:

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()) 

任意の設定はプラグインにすでにあったならば、それらが保存されているを確認します。

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

関連する問題