尝试使用Rcpp编译c ++ 11时出现g ++错误

Ski*_*kif 10 c++ gcc r rcpp c++11

系统规格:

  • 操作系统 - Mac OS X 10.6.8(雪豹)
  • g ++ - Macports gcc 4.8.1_2 +通用
  • R - 2.15.3
  • Rcpp - 0.10.3

当我尝试编译在R中使用C++ 11的函数(通过Rcpp)时,我继续收到错误 - 由于某种原因,g ++无法识别-std=c++11选项.

此示例取自Rcpp帮助文件(它不包含任何特定于C++ 11的内容,但可以显示我的问题).如果我尝试运行:

require( Rcpp )
Sys.setenv( "PKG_CXXFLAGS"="-std=c++11" )
cppFunction(plugins=c("cpp11"), '
int useCpp11() {
    int x = 10;
    return x;
}')
Run Code Online (Sandbox Code Playgroud)

我明白了:

cc1plus: error: unrecognized command line option "-std=c++11"
make: *** [file61239328ae6.o] Error 1
g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include -I/Library/Frameworks/R.framework/Resources/include/x86_64 -DNDEBUG  -I/usr/local/include  -I"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/Rcpp/include"   -std=c++11  -fPIC  -g -O2  -c file61239328ae6.cpp -o file61239328ae6.o 
Error in sourceCpp(code = code, env = env, rebuild = rebuild, showOutput = showOutput,  : 
  Error 1 occurred building shared library.
Run Code Online (Sandbox Code Playgroud)

同时,我可以直接从bash编译这个函数 - 如果这个代码在useCpp11.cpp文件中,那么这运行没有任何抱怨:

g++ useCpp11.cpp -std=c++11
Run Code Online (Sandbox Code Playgroud)

当然,我做错了什么,但我无法弄清楚它是什么.gcc 4.8被设置为bash中的默认编译器,Rcpp过去一直没有出错.我怀疑我不是在告诉R使用哪个版本的g ++ - 可能就是这种情况吗?

Ski*_*kif 11

Kevin Ushley是绝对正确的 - 确保正确使用正确的编译器的最简单方法是通过Makevars文件.在我的情况下,我补充说:

CXX = g++-4.8.1
PKG_CXXFLAGS = -std=c++11
Run Code Online (Sandbox Code Playgroud)

这是我一直缺少的 - 之后一切都奏效了.如果您正在编译包,这将有效.

  • 我使用完全相同的机制 - 但是在这里使用它的方式可以防止你创建CRAN兼容包,因为C++ 11选项现在是全局的(我们不允许上传C++ 11代码). (2认同)

Dir*_*tel 7

快速的:

  • 落后于Rcpp,发布版本为0.10.4

  • 您正在使用的版本(0.10.3)确实有一个C++ 11插件

  • 在Rcpp画廊一整篇文章详细介绍了这一点.

因此,请允许我引用Rcpp Gallery上的C++ 11文章:

R> library(Rcpp)
R> sourceCpp("/tmp/cpp11.cpp")
R> useAuto()
[1] 42
R> 
Run Code Online (Sandbox Code Playgroud)

其中的代码/tmp/cpp11.cpp如下:

#include <Rcpp.h>

// Enable C++11 via this plugin (Rcpp 0.10.3 or later)
// [[Rcpp::plugins("cpp11")]]

// [[Rcpp::export]]
int useAuto() {
    auto val = 42;      // val will be of type int
    return val;
}
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,那么您的系统设置不正确.换句话说,这不是Rcpp标签的问题- 而是'如何设置我的路径来调用我认为应该调用的g ++版本'.