重建R
从源头看来没有必要。这是我使用的步骤Windows 7 x64
系统,运行R 3.1.1
with Rtools 3.1.0.1942
。此更新的影响gcc
尚未经过彻底测试:
- 启动一个干净的 R 会话并
remove.packages("Rcpp")
以及其他任何东西Rcpp
有关的。关闭 R 会话。
- 下载并运行 MinGW-builds链接到 MinGW-builds 安装程序 http://sourceforge.net/projects/mingwbuilds/files/mingw-builds-install/.
- 选择 gcc version 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\;
第三条路径入口replaces包含在其中的一个Rtools
安装人员:[Drive]:\Rtools\gcc-4.6.3\bin
重新启动或以其他方式反映 PATH 更改。
- 开始清洁
R
会话并运行install.packages("Rcpp")
并对步骤 1 中删除的所有其他包重复此操作。
已遵循这些步骤R 3.1.1 (2014-07-10)
with Rcpp 0.11.2
。最简单的方法是使用rgui.exe
,而不是通过诸如RStudio
,由于静默加载先前的工作区和后者的包。
通过运行测试设置system('gcc -v')
in a 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)
确认精选的存在编译器错误gcc 4.6.3 to 4.8.0
不再存在,并测试一些新的C++11
可用的功能gcc 4.8.*
, in a R
会话运行Rcpp::sourceCpp
在以下代码中,另存为.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_);
}