在 Windows 上使用 Rtools 中包含的不同 gcc 版本和 Rcpp

Posted

技术标签:

【中文标题】在 Windows 上使用 Rtools 中包含的不同 gcc 版本和 Rcpp【英文标题】:Using a different gcc version from that included with Rtools with Rcpp on Windows 【发布时间】:2014-08-22 21:31:47 【问题描述】:

在我开始更新 gcc 之前,有没有人真正尝试过这个,他们是否可以确认需要从源代码构建 R 来更新用于使用 Rcpp 编译 c++ 代码的 gcc 版本(即不一定用于包创作,当然也不是CRAN 有效的软件包)?

查看 Dirk 对此问题的回答,以及来自原发帖人 How to use gcc 4.8.1 with Rcpp on Windows 的后续评论。

【问题讨论】:

【参考方案1】:

似乎没有必要从源代码重建R。这是我用于Windows 7 x64 系统的步骤,运行R 3.1.1Rtools 3.1.0.1942。此更新对gcc 的影响尚未经过彻底测试:

    开始一个干净的 R 会话和remove.packages("Rcpp") 和其他任何与Rcpp 相关的东西。关闭 R 会话。 从Link to MinGW-builds installer 下载并运行 MinGW 构建。 选择 gcc 版本 4.8.1/Arch x64/Threads posix/Exception sjlj /Build rev 5 并安装到 [Drive]:\Rtools\mingw-builds\ ...

    更新系统 PATH 变量以按以下顺序包含这些条目(位于或靠近 PATH 的顶部):[Drive]:\R\R-3.1.1\bin\x64;[Drive]:\Rtools\bin;[Drive]:\Rtools\mingw-build\x64-4.8.1-posix-sjlj-rev5\mingw64\bin\; 第三个路径条目替换 Rtools 安装程序包含的路径条目:[Drive]:\Rtools\gcc-4.6.3\bin

    重新启动或以其他方式反映 PATH 更改。

    启动一个干净的 R 会话并运行 install.packages("Rcpp") 并对在步骤 1 中删除的所有其他包重复此操作。

使用R 3.1.1 (2014-07-10)Rcpp 0.11.2 已遵循这些步骤。使用rgui.exe 最容易做到这一点,而不是通过诸如RStudio 之类的IDE,因为会静默加载以前的工作区和后者的包。

通过在R 会话中运行system('gcc -v') 来测试设置以获得:

COLLECT_GCC=F:\Rtools\MINGW-~1\X64-48~1.1-P\mingw64\bin\gcc.exe
COLLECT_LTO_WRAPPER=f:/rtools/mingw-~1/x64-48~1.1-p/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/4.8.1/lto-wrapper.exe
Target: x86_64-w64-mingw32
[Edited Config info]
Thread model: posix
gcc version 4.8.1 (rev5, Built by MinGW-W64 project) 

为了确认gcc 4.6.3 to 4.8.0 存在的一些 编译器错误不再存在,并在R 运行@ 的会话中测试gcc 4.8.* 提供的一些新C++11 功能以下代码中的 987654347@ 保存为 .cpp 文件,应该不会生成编译器警告或错误(而使用 gcc 4.6.3 将完全失败):

#include <Rcpp.h>

// [[Rcpp::plugins("cpp11")]]


template<typename T>
struct Wrap 

    int test2(int depth)
    
        m_test++;
        std::vector<int> v =  0, 1, 2, 3 ;
        return depth == 0? 1 : std::accumulate(
             v.begin(), v.end(), int(0), [=](int sub, int const&) 
             return sub + test2(depth - 1);
             );   
    

    int m_test = 0;
;


  struct X

  template <class T> static void bar() 

  template <class T> void foo(T p) 
  
    [&]  bar<T>(); ;
  
;

// [[Rcpp::export]]
double inheriting(int in_)

struct A  
  A(int u)
    hello = u*u/2.0;
  ; 
double hello;
;

struct B: A  using A::A; ;

  B b(in_);
  return(b.hello);


// [[Rcpp::export]]
void test_lambda(int in_)

  X x;
  x.foo(in_);


// [[Rcpp::export]]
int test_bug_4_7_2(int in_)

Wrap<int> w;
return w.test2(in_);

【讨论】:

您能否将此信息转发给 R-Core 并要求他们使用此更新的编译器更新 Rtools 发行版? ;) 我认为 R Core 需要一个构建 R 并且所有测试都通过的版本。他们更关心 C 而不是 C++...【参考方案2】:

这里我描述了我们如何使用 GCC v8.1.0 和 Rtools 在 R 中编译源代码包。

这是在带有 R v3.5.0 和 Rtools35 的 Windows 10 64 位家庭版上测试的。

    安装R 安装Rtools。默认安装位置为C:\Rtools。您将在Rtools 中看到以下子文件夹:

    通过如下编辑环境变量设置路径,使Rtools在路径中:

    删除 mingw_64 子文件夹内的所有内容 Rtools。 现在去this MinGW distro下载gcc。下载mingw-16.0-without-git.exe。

安装在其默认位置。请注意,默认情况下,它将安装在MinGW\ 文件夹中。复制/剪切此MinGW\ 文件夹内部的所有内容。

    转到Rtools 内的mingw_64 子文件夹 并粘贴在第5 步中复制/剪切的任何内容。粘贴后您将在mingw_64 子文件夹中看到这个?:

    测试您的设置以编译 R 包 rdatatable 中的 C/C++ 代码,并在 R 控制台中使用以下行:

    remove.packages("data.table")
    install.packages("data.table", type = "source",
    repos = "http://Rdatatable.github.io/data.table")
    

如果成功,你会发现这样的东西:

它也从源代码编译Rcpp

它可以编译所有带有编译代码的R packages,除了那些依赖外部库的代码。

【讨论】:

以上是关于在 Windows 上使用 Rtools 中包含的不同 gcc 版本和 Rcpp的主要内容,如果未能解决你的问题,请参考以下文章

调整面板大小以适应 Windows 窗体中包含的元素

如何使用 vscode 和 Windows 10 中包含的 ssh-keygen 功能使用 ssh-key auth?

OpenCV 2.4:Windows 中 Qt 中包含的问题

在 iOS 上使用下载包中包含的 XIB/NIB 文件

Windows下使用Rtools编译R语言包

使用 QPainter 和 paintEvent 在 PYQT5 中的 QLabel 中包含的 Pixmap 上绘制圆圈