10

我想设置-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);

但是详细的输出表明它忽略了这一点。我也尝试使用 CFLAGS,并且不包括现有值,但没有效果。

4

1 回答 1

10

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

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自己的代码,但后来的代码链接到第 3 方库并拒绝使用这些选项进行编译。)

于 2011-08-24T04:48:29.357 回答