【发布时间】:2014-08-22 21:31:47
【问题描述】:
在我开始更新 gcc 之前,有没有人真正尝试过这个,他们是否可以确认需要从源代码构建 R 来更新用于使用 Rcpp 编译 c++ 代码的 gcc 版本(即不一定用于包创作,当然也不是CRAN 有效的软件包)?
查看 Dirk 对此问题的回答,以及来自原发帖人 How to use gcc 4.8.1 with Rcpp on Windows 的后续评论。
【问题讨论】:
在我开始更新 gcc 之前,有没有人真正尝试过这个,他们是否可以确认需要从源代码构建 R 来更新用于使用 Rcpp 编译 c++ 代码的 gcc 版本(即不一定用于包创作,当然也不是CRAN 有效的软件包)?
查看 Dirk 对此问题的回答,以及来自原发帖人 How to use gcc 4.8.1 with Rcpp on Windows 的后续评论。
【问题讨论】:
似乎没有必要从源代码重建R。这是我用于Windows 7 x64 系统的步骤,运行R 3.1.1 和Rtools 3.1.0.1942。此更新对gcc 的影响尚未经过彻底测试:
remove.packages("Rcpp") 和其他任何与Rcpp 相关的东西。关闭 R 会话。更新系统 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_);
}
【讨论】:
这里我描述了我们如何使用 GCC v8.1.0 和 Rtools 在 R 中编译源代码包。
这是在带有 R v3.5.0 和 Rtools35 的 Windows 10 64 位家庭版上测试的。
Rtools在路径中:mingw_64 子文件夹内的所有内容 Rtools。安装在其默认位置。请注意,默认情况下,它将安装在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,除了那些依赖外部库的代码。
【讨论】: