2011-08-15 3 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'를 설정했지만 나중에 타사 라이브러리에 대한 링크를 코딩하고 해당 옵션을 사용하여 컴파일하는 것을 거부하는 경우를 상상해보십시오.)

관련 문제