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

标签 c++ r inline rcpp

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

相关文章:

C++:使用ifstream读取大型pgm文件

C++:嵌套模板类错误 "explicit specialization in non-namespace scope"

r - 测试不为 NULL 且等于 R 中的值

c - 没有 "inline"或 "static"的 "extern"在 C99 中有用吗?

c# - 在 C# 中检查方法内联

c++ - sem_timedwait 与 CLOCK_MONOTONIC_RAW/CLOCK_MONOTONIC

c++ - 明确论证?

python - 用于捕获数据的简单 UI

r - 我将如何创建这个数据框?我需要使用嵌套 for 循环吗?

c++ - 关于C++内联函数的几个问题