如何使用Rcpp和内联设置g ++编译器标志?

Dar*_*ook 10 c++ r inline rcpp

我想设置-std=c++0x,使用内联Rcpp.

在使用内联包时看到了R:C++ Optimization标志但不想进行系统范围的更改,所以我在Dirk的回答中尝试了选项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);
Run Code Online (Sandbox Code Playgroud)

但是详细的输出表明它忽略了这一点.我也试过CFLAGS,并没有包含现有价值,但没有效果.

Dar*_*ook 9

经过一些源代码研究,以及Dirk Eddelbuettel的暗示,我已经解决了这个问题:

settings$env$PKG_CXXFLAGS='-std=c++0x'
Run Code Online (Sandbox Code Playgroud)

您可以设置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())
Run Code Online (Sandbox Code Playgroud)

paste(),如果有那么它们被保存在任何插件已经设置确保.

unsetenv()cxxfunction应该已经做的事情(恕我直言).目前它将向环境添加变量,但之后不会删除它们.所以,unsetenv()如果你没有调用,如果你以后cxxfunction再次运行,但所有默认设置,CXXFLAGS你之前设置的任何默认设置都会被使用.这可能无关紧要,或者可能会产生令人惊讶的结果.(想象一下,如果您使用的PKG_CXXFLAGS是设置-Wall -Werror自己的代码,但稍后代码链接到第三方库并拒绝使用这些选项进行编译.)