Как установить флаги компилятора g ++, используя Rcpp и inline? - PullRequest
9 голосов
/ 15 августа 2011

Я хочу установить -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 Ответ

8 голосов
/ 24 августа 2011

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

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

...