先前推介的Rcpp for everyone书中介绍了更换编译器的方法。
2.1.4 Using other compilers installed by yourself
If you installed other compiler (g++, clang++) different from above, create the following file under the user’s home directory. Then set environment variables in the file.
Linux, Mac
.R/Makevars
Windows
.R/Makevars.win
Example settings of environmental variables
CC=/opt/local/bin/gcc-mp-4.7
CXX=/opt/local/bin/g++-mp-4.7
CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH
CXXFLAGS= -g0 -O2 -Wall
MAKE=make -j4
Building R for Windows 上面的Rtools有一段时间没有更新,里面的GCC还是4.9.3版。一直想让Rcpp用上最新的GCC:sunglasses: :sunglasses: :sunglasses: ,但是没有真正动手������
PS C:\Users\cheng> gcc -v
gcc version 4.9.3 (x86_64-posix-seh, Built by MinGW-W64 project)
在更换编译器前利用 Using Rcpp with C++11, C++14 and C++17 中的例子测试了一下Rtools中的C++编译情况。这个例子是C++14中的特性。结果宣告失败。
> Rcpp::cppFunction("auto doubleMe(const int &x) { return x + x; }")
c:/Rtools/mingw_64/bin/g++ -I"F:/program/R/include" -DNDEBUG -I"F:/program/R/library/Rcpp/include" -I"C:/Users/cheng/AppData/Local/Temp/RtmpYrb9qf/sourceCpp-x86_64-w64-mingw32-0.12.12" -I"d:/Compiler/gcc-4.9.3/local330/include" -O2 -Wall -mtune=core2 -c file310c11566111.cpp -o file310c11566111.o
file310c11566111.cpp:6:1: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
auto doubleMe(const int &x) { return x + x; }
^
file310c11566111.cpp:6:27: error: top-level declaration of 'doubleMe' specifies 'auto'
auto doubleMe(const int &x) { return x + x; }
^
file310c11566111.cpp:6:27: error: storage class 'auto' invalid for function 'doubleMe'
file310c11566111.cpp:11:1: warning: 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
auto doubleMe(const int& x);
^
file310c11566111.cpp:11:27: error: top-level declaration of 'doubleMe' specifies 'auto'
auto doubleMe(const int& x);
^
file310c11566111.cpp:11:27: error: storage class 'auto' invalid for function 'doubleMe'
make: *** [file310c11566111.o] Error 1
Warning message:
运行命令'make -f "F:/program/R/etc/x64/Makeconf" -f "F:/program/R/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_2.dll" WIN=64 TCLBIN=64 OBJECTS="file310c11566111.o"'的状态是2
Error in sourceCpp(code = code, env = env, rebuild = rebuild, cacheDir = cacheDir, :
Error 1 occurred building shared library.
新的C++编译器选择 MinGW-w64 :
- Rtools使用的编译器就是MinGW-w64,只是版本较旧
- Mingw-w64更新快,及时跟进GCC
下载 MinGW-w64 的安装文件,点击mingw-w64-install.exe文件,具体选项选择如下。
安装需要一段时间,安装完毕如下。
直接复制到Rtools文件夹中,并且把原先的mingw_64备份处理,刚复制来的mingw64重命名为mingw_64。具体如下。
MinGW-w64更新完毕。检测一下版本号。
PS C:\Users\cheng> gcc -v
gcc version 7.1.0 (x86_64-win32-seh-rev2, Built by MinGW-W64 project)
重新用 Using Rcpp with C++11, C++14 and C++17 中的例子测试新版的C++编译器。运算顺利出结果。
> Rcpp::cppFunction("auto doubleMe(const int &x) { return x + x; }")
> doubleMe(1L)
[1] 2
编译R语言第三方包不会有问题吧?试一试。
重新安装R语言数据整理利器data.table,顺利编译,安装成功。
remove.packages("data.table")
install.packages("data.table", type = "source",
repos = "http://Rdatatable.github.io/data.table")
本次更新C++编译器重在 尝鲜、折腾 ,GCC版本从4.9.3飞到7.1.0,实用价值:smile::smile::smile:
本次折腾环境:
win10 15063.540
R 3.4.0