【问题标题】:R package build error: '-std=c++11 or -std=gnu++11 compiler options'R 包构建错误:'-std=c++11 或 -std=gnu++11 编译器选项'
【发布时间】:2019-11-07 18:31:25
【问题描述】:

我正在尝试构建一个包含 Rcpp 和 RcppArmadillo 代码的 R 包。 sourceCpp() 工作正常,一切运行顺利,但是当我尝试构建包时,我得到:“这个文件需要编译器和库支持 ISO C++ 2011 标准。这种支持目前是实验性的,必须 使用 -std=c++11 或 -std=gnu++11 编译器选项启用。"

在描述文件中包含 RcppArmadillo 和 Rcpp11 似乎没有帮助(见下文)

我的描述文件包括:

Imports:
  Rcpp (>= 0.12.13),
  RcppArmadillo (>= 0.7.900.2.0),
  Rcpp11 (>=    3.1.1.0),
  data.table
LinkingTo: Rcpp, RcppArmadillo, Rcpp11

我没有包含这两个 .cpp 文件,因为它们相当长,但显然问题似乎是使用 C++11 语法。

【问题讨论】:

  • 什么包?文件怎么说?你用的是什么编译器?什么平台?此处不详。
  • 您几乎永远不需要(积极维护的)Rcpp 包和有点“休眠”(在 Monty Python 鹦鹉短剧意义上)Rcpp11。您可以通过 src/Makevars*SystemRequirements 开启 C++11,请参阅编写 R 扩展或 许多 现有的 CRAN 包了解更多信息。

标签: rcpp rcpp11 rcpparmadillo


【解决方案1】:

Rcpp11不是 Rcpp。换句话说,Rcpp11Rcpp 是两个独立的 R 包,它们提供了 RC++ 对象之间的“粘合剂”。因此,它们具有根本不同的 API。

DESCRIPTION 文件中删除Rcpp11 应该可以让一切正常工作。

Imports:
  Rcpp (>= 0.12.13),
  RcppArmadillo (>= 0.7.900.2.0),
  data.table
LinkingTo: Rcpp, RcppArmadillo

要启用 C++ 11src/Makevarssrc/Makevars.win 中使用:

CXX_STD = CXX11 # Required for C++11
PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) 
PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

注意:RcppArmadillo 需要后两行。有关使用 C++-11 的示例包,请参阅:https://github.com/r-pkg-examples/rcpp-cpp11-usage

【讨论】:

  • 我无法理解 Rcpp11 包的用途。你能描述一个用例吗?
  • Rcpp11 确实没有用例,因为它处于休眠开发状态。话虽如此,Rcpp11 旨在通过利用 C++11 和更强大的语言特性来改进 RC++ 对象之间的传输方式。不过,这会导致对 C++98 功能的支持被弃用。但是,由于大多数平台仍在运送旧的编译器,这还没有发生。
【解决方案2】:

Dirk's post 上找到了解决方案。在 Makevars 和 Makevars.win 文件中的选项

CXX_STD = CXX11

被排除在外。包括这个选项(删除'#'),它就没有问题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2018-05-12
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多