我想设置-std=c++0x
,使用带有内联的 Rcpp。
I saw R:使用内联包时的 C++ 优化标志但不想进行系统范围的更改,所以我尝试了 Dirk 答案中的选项 2。
I tried:
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())
The paste()
确保插件中是否已有任何设置,然后它们会被保留。
The unsetenv()
是某事cxxfunction
应该已经在做了(恕我直言)。目前它会将变量添加到环境中,但之后不会将其删除。所以,如果没有unsetenv()
打电话,如果你后来跑了cxxfunction
再次,但使用所有默认值,任何CXXFLAGS
你之前设置的会被使用。这可能并不重要,或者可能会产生令人惊讶的结果。 (想象一下如果你正在使用PKG_CXXFLAGS
to set -Wall -Werror
对于您自己的代码,但后来的代码链接到第三方库并拒绝使用这些选项进行编译。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)