2011-08-15 14 views
9

Quiero configurar -std=c++0x, usando Rcpp con en línea.¿Cómo se configuran las banderas del compilador g ++ usando Rcpp y en línea?

Vi R: C++ Optimization flag when using the inline package pero no quiero hacer un cambio en todo el sistema, así que estaba probando la opción 2 en la respuesta de Dirk.

me trataron:

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

Pero el resultado detallado muestra que está haciendo caso omiso de eso. También probé con CFLAGS, y sin incluir el valor existente, pero sin efecto.

Respuesta

8

Después de algunos estudios código fuente, y un toque de Dirk Eddelbuettel, he trabajado esto:

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

Es posible ajustar PKG_CPPFLAGS la misma manera.

Aquí es un ejemplo completo y más robusto:

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

La pasta() se asegura de si había alguna configuración que ya están en el plugin entonces ellos se conservan.

El unsetenv() es algo que cxxfunction ya debería estar haciendo (en mi humilde opinión). Actualmente agregará variables al entorno, pero no las eliminará después. Por lo tanto, sin la llamada a unsetenv(), si luego ejecutó cxxfunction nuevamente, pero con todos los valores predeterminados, cualquier CXXFLAGS que haya establecido anteriormente se usará. Esto podría no importar, o podría dar resultados sorprendentes. (Imagine que estuviera utilizando PKG_CXXFLAGS para establecer '-Wall -Werror' para su propio código, pero luego el código se vinculará a una biblioteca de terceros y se rehusará a compilar con esas opciones.)

Cuestiones relacionadas