我想设置 -std=c++0x
,使用带内联的 Rcpp。
我看到了R: C++ Optimization flag when using the inline package但不想在系统范围内进行更改,所以我在 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,但没有包含现有值,但没有效果。
最佳答案
经过一些源代码研究和 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 方库并拒绝使用这些选项进行编译。)
关于c++ - 如何使用 Rcpp 和内联设置 g++ 编译器标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7063265/