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

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

请参阅Dirk对此问题的回答,以及来自原始海报的后续评论如何在Windows上使用gcc 4.8.1与Rcpp 。

Solutions Collecting From Web of "在Windows上使用包含Rtools和Rcpp的gcc版本"

从源重建R似乎没有必要。 以下是我用于Windows 7 x64系统的步骤,使用Rtools 3.1.0.1942运行R 3.1.1 。 这个更新对gcc还没有经过彻底的测试:

  1. 开始一个干净的R会话和remove.packages("Rcpp")和其他任何Rcpp相关。 关闭R会话。
  2. 从Link下载并运行MinGW-builds 到MinGW-builds安装程序 。
  3. 选择gcc版本4.8.1 / Arch x64 /线程posix /异常sjlj / Build rev 5并安装到[Drive]:\ Rtools \ mingw-builds \ …
  4. 更新系统PATH变量以按照以下顺序(在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所提供编译器错误的选择 ,以及使用gcc 4.8.*在一个运行Rcpp::sourceCppR会话中测试一些新的C++11功能gcc 4.8.*下面的代码,保存为.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_); }