CentOS 6安装R包lubridate:Makevars未正确覆盖g++问题
解决CentOS 6下安装lubridate时gcc版本兼容问题
我之前也遇到过一模一样的情况——CentOS 6默认的gcc 4.4.7完全满足不了lubridate对C++11特性的要求,手动编译gcc 4.9后配置~/.R/Makevars也踩了好几个坑。结合我的踩坑经验,给你几个排查和解决的方向:
1. 检查~/.R/Makevars的配置是否完整
很多人只设置了基础的CC和CXX变量,但忽略了C11相关配置和库路径指定,这会导致即使调用了gcc 4.9,编译时还是会链接到系统旧库或者不启用C11标准。正确的配置应该类似这样:
# 替换成你gcc4.9的实际安装路径,比如/usr/local/gcc4.9/bin CC=/usr/local/gcc4.9/bin/gcc CXX=/usr/local/gcc4.9/bin/g++ CXX11=/usr/local/gcc4.9/bin/g++ CXX11STD=c++11 # 指定头文件和库路径,避免链接系统旧库 CPPFLAGS="-I/usr/local/gcc4.9/include" LDFLAGS="-L/usr/local/gcc4.9/lib64 -Wl,-rpath,/usr/local/gcc4.9/lib64"
注意:如果是32位系统,把lib64改成lib;路径一定要和你实际编译安装gcc4.9的位置一致,别写错了。
2. 先验证gcc 4.9本身是否能正常工作
有时候不是R的问题,是你编译的gcc4.9本身就存在依赖缺陷。先在终端里跑这几个命令确认:
- 检查版本:
/usr/local/gcc4.9/bin/gcc --version,确保输出是4.9.x - 测试C++11编译:写个简单的测试文件
test.cpp:
然后编译运行:#include <iostream> int main() { auto num = 123; std::cout << "Test C++11: " << num << std::endl; return 0; }/usr/local/gcc4.9/bin/g++ -std=c++11 test.cpp -o test ./test
如果运行失败,说明你的gcc4.9编译时依赖没装全,建议重新编译或者换用下面更省心的SCL方案。
3. 清理R的编译缓存后重新安装
R会缓存之前的编译配置,即使你改了Makevars,旧缓存可能还在干扰。按这个步骤来:
- 打开R,先卸载残留的lubridate(如果有的话):
remove.packages("lubridate") - 设置强制重新编译:
Sys.setenv(R_COMPILE_AND_INSTALL_PACKAGES="always") - 从源码安装:
install.packages("lubridate", type="source")
或者直接用命令行编译安装,更直观:
# 先从CRAN下载lubridate的源码包,替换成你下载的版本号 R CMD INSTALL --configure-args="CXX=/usr/local/gcc4.9/bin/g++ CXX11=/usr/local/gcc4.9/bin/g++" lubridate_1.9.2.tar.gz
4. 最省心的方案:用CentOS SCL的devtoolset-3
手动编译gcc太容易踩库依赖的坑,CentOS 6的软件集合(SCL)里有官方维护的gcc4.9包,叫devtoolset-3,完全适配CentOS6的系统环境,步骤更简单:
- 安装SCL源:
yum install centos-release-scl - 安装devtoolset-3:
yum install devtoolset-3-gcc devtoolset-3-gcc-c++ - 启用devtoolset-3:
scl enable devtoolset-3 bash - 现在启动R,直接安装lubridate:
install.packages("lubridate")
这个方法不需要改Makevars,启用SCL后,当前终端的gcc/g++默认就是4.9版本,完全满足lubridate的要求。
如果还是有问题,建议把安装时的具体报错信息贴出来,这样能更精准地定位问题。
内容的提问来源于stack exchange,提问作者jearl
相关产品推荐
相关产品推荐

