Как установить флаги компилятора g++ с помощью Rcpp и inline?

Я хочу -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 и без включения существующего значения, но без эффекта.

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