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

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

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

【问题讨论】:

    标签: c++ windows r gcc rcpp


    【解决方案1】:

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

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

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

    6. 启动一个干净的 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.0Rtools35 的 Windows 10 64 位家庭版上测试的。

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

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

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

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

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

    1. 测试您的设置以编译 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,除了那些依赖外部库的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多