Как установить флаги компилятора g++, используя Rcpp и встроенный?

Я хочу установить -std=c++0x, используя Rcpp со встроенным.

Я видел R: Флаг оптимизации C++ при использовании встроенного пакета но не хочу вносить общесистемные изменения, поэтому я пробовал вариант 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 и без включения существующего значения, но безрезультатно.


person Darren Cook    schedule 15.08.2011    source источник


Ответы (1)


После некоторого изучения исходного кода и подсказки Дирка Эддельбюттеля я понял следующее:

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 уже должен делать (ИМХО). В настоящее время он добавит переменные в среду, но не удалит их после. Таким образом, без вызова unsetenv(), если вы позже снова запустите cxxfunction, но со всеми значениями по умолчанию, будет использоваться любой CXXFLAGS, который вы ранее установили. Это может не иметь значения или может дать удивительные результаты. (Представьте, что вы использовали PKG_CXXFLAGS для установки -Wall -Werror для своего кода, но позже код связывается со сторонней библиотекой и отказывается компилироваться с этими параметрами.)

person Community    schedule 24.08.2011