2011-08-15 24 views
9

Satır içi Rcpp kullanarak -std=c++0x'u ayarlamak istiyorum.Rcpp ve satır içi kullanarak g ++ derleyici bayrakları nasıl ayarlanır?

R: C++ Optimization flag when using the inline package'u gördüm, ancak sistem genelinde değişiklik yapmak istemiyorum, bu yüzden Dirk'ün yanıtında 2. seçeneği deniyordum.

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

Ama ayrıntılı çıktı o görmezden geliyor göstermektedir:

denedim. Ayrıca CFLAGS ile ve varolan değeri dahil etmeden denedim, ama hiçbir etkisi yoktu.

cevap

8

bazı kaynak kodu çalışmanın ve Dirk Eddelbuettel bir ipucu sonra bunu dışarı çalıştık:

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

Aynı yolu PKG_CPPFLAGS ayarlayabilirsiniz.

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

macun() zaten eklentisinde sonra korunur herhangi bir ayar vardı emin eğer yapar:

İşte tam ve daha sağlam bir örnektir.

Unsetenv() zaten bir cxxfunction yapması gereken bir şeydir (IMHO). Şu anda çevreye değişkenler ekleyecektir, ancak bunları sonradan kaldırmaz. Yani, unsetenv() çağrısı olmadan, daha sonra tekrar cxxfunction çalıştırırsanız, ancak tüm varsayılanlarla, daha önce ayarladığınız CXXFLAGS kullanılacaktır. Bu önemli olmayabilir ya da şaşırtıcı sonuçlar verebilir. (Kendi kodunuz için '-Wall -Werror' komutunu ayarlamak için PKG_CXXFLAGS kullanıyor olsaydınız, ancak daha sonra 3. taraf kitaplığına kod bağlar ve bu seçeneklerle derlemeyi reddedersiniz.)

İlgili konular