Как установить флаги компилятора 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
для вашего собственного кода, но позже код ссылается на стороннюю библиотеку и отказывается компилироваться с этими параметрами.)