在Windows上使用与Rtools一起使用的不同gcc版本和Rcpp

Rus*_*Kax 5 c++ windows gcc r rcpp

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

请参阅Dirk对此问题的回答,以及原始海报如何在Windows上使用gc 4.8.1和Rcpp的后续评论.

Rus*_*Kax 6

R从源代码重建似乎没有必要.下面是我用一个步骤Windows 7 x64的系统,运行R 3.1.1Rtools 3.1.0.1942.此更新的含义gcc尚未经过彻底测试:

  1. 开始一个干净的R会话remove.packages("Rcpp")以及其他任何Rcpp相关的事情.关闭R会话.
  2. Link到MinGW-builds安装程序下载并运行MinGW-builds .
  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,而不是通过IDE,例如RStudio,由于前者工作空间和后者的包的静默加载.

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

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) 
Run Code Online (Sandbox Code Playgroud)

要确认选择的编译器错误gcc 4.6.3 to 4.8.0不再存在,并且在以下代码运行的会话中测试一些C++11可用的新功能,保存为文件,应该不会生成编译器警告或错误(这将完全失败使用):gcc 4.8.*RRcpp::sourceCpp.cppgcc 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_);
}
Run Code Online (Sandbox Code Playgroud)

  • 您能否将此信息转发给R-Core并要求他们使用此更新的编译器更新Rtools发行版?;) (4认同)