【问题标题】:How to make sure win-builder builds my package with c++11?如何确保 win-builder 使用 c++11 构建我的包?
【发布时间】:2018-02-07 16:11:12
【问题描述】:

我正在尝试让我的包 (code available here) 通过 win-builder 测试,以便我可以上传到 cran。该包严重依赖 Rcpp,我使用了一些需要 C++11 标准的东西。但win-builder test results 不断显示如下警告:

warning: delegating constructors only available with -std=c++11 or -std=gnu++11
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11

我尝试使用 Rcpp.package.skeleton() 示例包进行最小测试,添加了一些扩展的初始化列表使用,以及仅包含一行的 Makevars 文件:

CXX_STD = CXX11

但最小的测试工作正常。您可以在 win-builder 测试结果中看到它使用 -std=gnu++11 编译的最小测试,而我的包是在没有该选项的情况下编译的:

最小测试:

*** arch - i386
d:/Compiler/gcc-4.9.3/mingw_32/bin/g++  -std=gnu++11 -I"D:/RCompile/recent/R/include" -DNDEBUG  -I"d:/RCompile/CRANpkg/lib/3.5/Rcpp/include"   -I"d:/Compiler/gcc-4.9.3/local330/include"     -O2 -Wall  -mtune=core2 -c RcppExports.cpp -o RcppExports.o

我的包裹:

*** arch - i386
d:/Compiler/gcc-4.9.3/mingw_32/bin/g++  -I"D:/RCompile/recent/R/include" -DNDEBUG  -I"d:/RCompile/CRANpkg/lib/3.5/Rcpp/include"   -I"d:/Compiler/gcc-4.9.3/local330/include"     -pedantic -O2 -Wall  -mtune=core2 -c Individual.cpp -o Individual.o

为什么用不同的选项编译它们?我正在使用完全相同的Makevars 文件。以防万一,我的DESCRIPTION 上有这些行:

Imports:
    Rcpp (>= 0.12.14),
    Matrix,
    grid,
    animation
LinkingTo: Rcpp
Suggests:
    knitr,
    rmarkdown
Depends:
    R (>= 3.1.0)
License: GPL-2
LazyData: true
RoxygenNote: 6.0.1
URL: https://github.com/Lobz/facilitation
VignetteBuilder: knitr

编辑:我将以上内容复制到最小测试包的DESCRIPTION 文件中以使它们更加相似,并且最小测试文件仍然可以使用-std=gnu++11 正确编译。

注意:我通过devtools::build_win()将包上传到win-builder。

【问题讨论】:

  • 你无法改变win-builder使用g++ 4.9.3的事实。它具有不完整的 C++11 支持,尤其是在库方面。故事结束。
  • 谢谢,@DirkEddelbuettel!知道为什么我的测试编译不同吗?
  • 您应该更显着地链接到您的源代码库。乍一看,您错过了src/Makevars.win 文件——如果您使用正确的包创建帮助器(我们为其记录了两个不同的帮助器),则不会发生这种情况。
  • 再次感谢@DirkEddelbuettel。我正在调查它。我不知道那些存在。我可以问一下在这种情况下谁是“我们”,我在哪里可以找到这份文件?
  • 那么您是如何找到 Rcpp 的,您是如何设法不找到 例如它的小插曲的?

标签: c++ r c++11 rcpp r-package


【解决方案1】:

尝试添加DESCRIPTION

SystemRequirements: C++11

这避免了必须为不同平台指定自定义 Makevars 的需要(例如,Makevars 用于 Unix + Solaris + macOS,Makevars.win 用于 Windows)。

但是,正如@DirkEddelbuettel 所说,Windows 上存在 C++11 支持;但是,C++11 实现与 gcc-4.9.3 的完整性在库方面存在问题

【讨论】:

  • Windows 上的 C++11 支持并不“不稳定”,我从未这么说过。你会得到g++-4.9.3 提供的东西。不多也不少。我们曾经不得不向后移植 C++11 库所缺乏的东西。至于在 DESCRIPTION 中添加 C++11 声明,我一直认为我更喜欢 src/Makevars{,.win} 方法,但偏好不同,两者都有效。
  • @DirkEddelbuettel 已修改。对于那个很抱歉。在 union 中快速打字。
  • 感谢@coatless 的想法,我一直在寻找这样的解决方案。此外,它似乎有效,我对 Makevars 和 Makevars.win 的尝试还没有奏效。我的构建报告现在显示 -std=gnu++11 选项并且警告消失了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多