在 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.1
和Rtools 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vscode 和 Windows 10 中包含的 ssh-keygen 功能使用 ssh-key auth?
OpenCV 2.4:Windows 中 Qt 中包含的问题
使用 QPainter 和 paintEvent 在 PYQT5 中的 QLabel 中包含的 Pixmap 上绘制圆圈