热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

九九八十一难:Linux下从源码安装R

引言不像在windows上面下载安装包进行安装那么简单,你只要选择好安装目录,然后一直next就行。要在Linux下通过源码安装R包是一件非常耗时耗力的事情。由于个人工作性质的原因
引言

不像在windows上面下载安装包进行安装那么简单,你只要选择好安装目录,然后一直next就行。要在Linux下通过源码安装R包是一件非常耗时耗力的事情。由于个人工作性质的原因,需要常常使用大型机进行作业,但是大型机基本都是Linux系统,由于需要使用R,并且经常会做一些个性化分析,需要自己安装相应的R包,但是由于自己没有root权限,在安装软件时难免会收到这样那样的掣肘。我第一次安装R以失败告终,因为安装R时会告诉你需要A库,然后你去安装A库,但是当你去安装A库的时候又会告诉你需要安装B库,如此循环往复,最后终于心撕力竭,手头又有其他事情要忙,终于铩羽而归。但是有一天遇到王道明,他正好也有过如此安装R的经历,最后捯饬了半天终于成功,最后还把这个经历总结下来,我当时内心狂喜,仿佛得到了武功秘籍。想着终于可以痛快地安装R了,但是事实证明我还是Too young Too simple,最后还是经历了之前没有预想到的大坑,凭借着王道明的安装指南和R官方文档,才终于功德圆满,取经归来。

第一难:R依赖库的安装

在安装R之前首先要安装R依赖的包,如何知道R安装需要什么包呢?可以去看R的官方文档R Installation and Administration ,我们主要要安装的依赖包是zlib,bzip,liblzma(这个包如果直接搜索liblzma出来的会是XZ,没错,需要安装的就是XZ)以及PCRE。不过首先需要注意的是,我安装的R版本是R-3.4.2 Short Summer,2017-09-28发行,而依照的官方文档也是Version 3.4.2 2017-09-28,因此其他版本的不一定完全适用,但是一般来说R所依赖的包大致都是这些,可能有版本的区别,安装R的大致顺序也差不多。其次,在安装这些库时最好遵照我下面给出的顺序来依次进行。否则就会报错。
1.安装zlib1.2.5版本及以上

cd zlib-1.2.11
./configure --prefix =/bulider/software/zlib
make
make install

2.安装bzip

cd bzip2-1.0.6
make -f Makefile-libbz2_so
修改Makefile 中的PREFIX=/bulider/software/bzip2
make && make install

3.安装liblzma5.0.3版本及以上

cd xz-5.2.3
./configure -prefix=/bulider/software/xz
make
make install

4.安装pcre

tar -zxvf pcre-8.41.tar.gz
cd pcre-8.41
./configure --enable-utf --enable-unicode-properties --enable-jit --disable-cpp --prefix /bulider/software/pcre##这个包的安装参数是有要求的,因此用的是官方文档的推荐命令
make
make install

5.安装libcurl7.22.0及以上,但是不要超过版本8

tar -zxf curl-7.28.0.tar.gz
cd curl-7.28.0
./configure --prefix=/bulider/software/curl
make
make install
第二难:安装R

安装了一打R的依赖包以后,你以为就能修成正果,急流勇退了吗?如果你有这个想法我想说你还是图样图森破!上台拿衣服!
1.进行configure

/source/R-3.4.2/configure --prefix=/builder/software/R --en
able-R-shlib --with-cairo --with-jpeglib --with-readline --with-tcltk --with-blas --with-lapack --enable-R-profiling LDFLAGS="-L/builder/software/zlib/lib -L/builder/software/bzip2/lib -L/builder/software/xz/lib -L/builder/software/pcre/lib -L/builder/so
ftware/curl/lib" CPPFLAGS="-I/builder/zlib/include -I/builder/softw
are/bzip2/include -I/builder/software/xz/include -I/builder/software/pcre/in
clude -I/builder/software/curl/include"##第一步检查环境配置,生成Makefile

首先注意一点,如果你要把R安装到另一个文件夹里而不是源码所在的文件夹里,那么你首先要创建一个文件夹,然后在这个文件夹里对R进行编译,在configure时要加上全路径/source/R-3.4.2/configure,同时在后面加上--prefix=参数,比方我要安装到/builder/software/R,那么就需要加入--prefix=/builder/software/R这个参数,而我的源码在/source/R-3.4.2这个文件夹里。
其次由于R是用C语言写的,因此要从源码编译R需要把R的源码需要通过gcc将源码编译为可执行文件。在前面我们安装了一些R的依赖库,这些依赖库是在编译R的时候要用到的,如果在一般情况下这些依赖库都会放到系统指定的位置来进行使用,但是由于我没有root权限,因此无法将这些库文件放到系统指定的库路径或者修改相应的配置文件,只能把这些库的路径通过LDFLAGSCPPFLAGS这两个参数来传递给gcc,关于这两个参数可以参考。告诉gcc这些路径里有相应的库。其中LDFLAGS传递的是给链接器的参数,CPPFLAGS传递的是相应的头文件。这两个参数都是configure的参数。
2.通过上一步生成了Makefile后,觉得胜利已经在前方向你招手,于是你进行了

make

但是出现了报错!

/usr/bin/ld: warning: libpcre.so.1, needed by ../../lib/libR.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: liblzma.so.5, needed by ../../lib/libR.so, not found (try using -rpath or -rpath-link)
../../lib/libR.so: undefined reference to `pcre_fullinfo'
../../lib/libR.so: undefined reference to `lzma_lzma_preset@XZ_5.0'
../../lib/libR.so: undefined reference to `lzma_alone_decoder@XZ_5.0'
../../lib/libR.so: undefined reference to `lzma_crc64@XZ_5.0'
../../lib/libR.so: undefined reference to `lzma_raw_encoder@XZ_5.0'
../../lib/libR.so: undefined reference to `pcre_config'
../../lib/libR.so: undefined reference to `lzma_code@XZ_5.0'
../../lib/libR.so: undefined reference to `lzma_stream_decoder@XZ_5.0'
../../lib/libR.so: undefined reference to `pcre_free'
../../lib/libR.so: undefined reference to `lzma_raw_decoder@XZ_5.0'
../../lib/libR.so: undefined reference to `pcre_free_study'
../../lib/libR.so: undefined reference to `pcre_assign_jit_stack'
../../lib/libR.so: undefined reference to `pcre_exec'
../../lib/libR.so: undefined reference to `lzma_version_string@XZ_5.0'
../../lib/libR.so: undefined reference to `pcre_maketables'
../../lib/libR.so: undefined reference to `lzma_stream_encoder@XZ_5.0'
../../lib/libR.so: undefined reference to `pcre_compile'
../../lib/libR.so: undefined reference to `pcre_study'
../../lib/libR.so: undefined reference to `pcre_version'
../../lib/libR.so: undefined reference to `lzma_end@XZ_5.0'
../../lib/libR.so: undefined reference to `pcre_jit_stack_alloc'
collect2: error: ld returned 1 exit status
make[3]: *** [R.bin] Error 1
make[3]: Leaving directory `/builder/software/R/src/main'
make[2]: *** [R] Error 2
make[2]: Leaving directory `/builder/software/R/src/main'
make[1]: *** [R] Error 1
make[1]: Leaving directory `/builder/software/R/src'
make: *** [R] Error 1

这个报错是因为什么原因导致的?我们可以看到里面说

/usr/bin/ld: warning: libpcre.so.1, needed by ../../lib/libR.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: liblzma.so.5, needed by ../../lib/libR.so, not found (try using -rpath or -rpath-link)

说缺少libpcre.so.1liblzma.so.5这两个库文件,我心里浮现了一副黑人问号脸我在前面./configure的时候还传入了PCREXZ这两个库的路径,为什么还是会报错?
于是我先是进行了谷歌,从谷歌上找到了一篇R安装攻略,在这篇攻略里也提到了这个问题,

此处报错是由于没有找到动态库,看第一二行
解决方法:添加动态库
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/opt/pcre-8.39/lib
/opt/xz-5.2.2/lib

但是在这个攻略里最后的解决方法是修改/etc/ld.so.conf文件,将前面安装的库的路径添加到这个文件中,但是我没有root权限,并不能修改这个文件,因此这个方法对我并不适用。后来在鹏帆和许骄的提醒下,我们在后面看到建议说try using -rpath or -rpath-link,后来我搜索了这两个命令,这两个命令是用于通过gccld传递参数的时候用的,

gcc编译链接动态库时,很有可能编译通过,但是执行时,找不到动态链接库,那是因为-L选项指定的路径只在编译时有效,解决方法是通过-Wl(注意,是字母表K之后的小写L),rpath=,使得execute记住链接库的位置

于是我试着在configure的时候加入这两个参数

/builder/software/R-3.4.2/configure --prefix=/builder/software/R --en
able-R-shlib --with-cairo --with-jpeglib --with-readline --with-tcltk --with-blas --with-lapack --enable-R-profiling LDFLAGS="-L/builder/software/zlib/lib -L/builder/software/bzip2/lib -L/builder/software/xz/lib -Wl,--rpath/builder/software/pcre/lib -Wl,--rpath/builder/so
ftware/curl/lib" CPPFLAGS="-I/builder/software/zlib/include -I/builder/softw
are/bzip2/include -I/builder/software/xz/include -I/builder/software/pcre/in
clude -I/builder/software/curl/include

但是这样总会报错,后来我知道,configure的时候我们传入的参数都会写到Makeconf文件里面,那么我可不可以先按照原来的我方法先进行configure,然后再对Makeconf文件进行修改呢?于是我还是先按照之前的方法进行configure

/builder/software/R-3.4.2/configure --prefix=/builder/software/R --en
able-R-shlib --with-cairo --with-jpeglib --with-readline --with-tcltk --with-blas --with-lapack --enable-R-profiling LDFLAGS="-L/builder/software/zlib/lib -L/builder/software/bzip2/lib -L/builder/software/xz/lib -L/builder/software/pcre/lib -L/builder/so
ftware/curl/lib" CPPFLAGS="-I/builder/software/zlib/include -I/builder/softw
are/bzip2/include -I/builder/software/xz/include -I/builder/software/pcre/in
clude -I/builder/software/curl/include

然后在make之前修改Makeconf中的参数

LDFLAGS = -L/builder/software/zlib/lib -L/builder/software/bzip2/lib -L/builder/software/curl/lib -Wl,-rpath=/builder/software/xz/lib -Wl,-rpath=/builder/software/pcre/lib

再进行

make

之前的报错终于不见了!但是出现了新的报错心里有句mmp:

/usr/bin/ld: cannot find -lpcre
collect2: error: ld returned 1 exit status
make[3]: *** [libR.so] Error 1
make[3]: Leaving directory `/builder/software/R-3.4.2/src/main'
make[2]: *** [R] Error 2
make[2]: Leaving directory `/builder/software/R-3.4.2/src/main'
make[1]: *** [R] Error 1
make[1]: Leaving directory `/builder/software/R-3.4.2/src'
make: *** [R] Error 1

于是我在想,可能是前面我把LDFLAGS里面参数由-L/builder/software/pcre/lib修改为了-Wl,-rpath=/builder/software/pcre/lib之后不再出现原来的报错,但是现在又出现了新的报错,而我在使用原来的参数时不会出现这个新的报错,结合之前我搜索到的结果,是不是因为我之前的写法只能让路径gcc在编译时有效,而后来的写法只能让其在进行运行时有效?那么如果我让两种参数同时出现,虽然我把库的路径传递了两次,但是会不会就不再报错了?时间是检验真理的唯一标准!先试验一把!于是我把两种参数的路径都加到了Makeconf

LDFLAGS = -L/builder/software/zlib/lib -L/builder/software/bzip2/lib -L/builder/software/xz/lib -L/builder/software/pcre/lib -L/builder/software/curl/lib -Wl,-rpath=/builder/software/xz/lib -Wl,-rpath=/builder/software/pcre/lib

再次进行

make

终于没有了报错。说明make成功了,于是我再进行

make install

终于安装完成!你挑着担我牵着马

总结

1.在Linux下用源码安装R是个大坑尤其是在没有root权限的情况下
2.安装R之前一定要将R要求的依赖库预先安装好,版本和安装顺序都要对。具体可以参考R官方文档R Installation and Administration 。
3.在安装好R的依赖库之后,在进行R的安装的时候要注意将依赖库的路径传入到参数中,而且一定要注意传入的方式。
4.注意分析报错信息,从中寻找原因,不要盲目瞎想,多谷歌,多问老司机。
5.关于-Wl -rpath更详细的介绍参考


推荐阅读
  • 本文详细介绍了如何在 Ubuntu 14.04 系统上搭建仅使用 CPU 的 Caffe 深度学习框架,包括环境准备、依赖安装及编译过程。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • PHP 5.4.8 编译安装指南
    本文详细介绍了如何在Linux环境下编译安装PHP 5.4.8,并配置为FastCGI模式运行。包括所需依赖包的安装、源代码下载、编译配置及启动服务等步骤。 ... [详细]
  • Nagios可视化插件开发指南 —— 配置详解
    本文详细介绍了Nagios监控系统的配置过程,包括数据库的选择与安装、Nagios插件的安装及配置文件的解析。同时,针对常见的配置错误提供了具体的解决方法。 ... [详细]
  • 运用DDD分层架构优化微服务代码设计
    在微服务实施过程中,确定合理的代码结构至关重要。本文探讨了如何利用领域驱动设计(DDD)的分层架构来优化微服务的代码模型,确保系统的可维护性和扩展性。 ... [详细]
  • Linux环境下的PHP7安装与配置指南
    本文详细介绍了如何在Linux操作系统中安装和配置PHP7,包括检查当前PHP版本、升级PHP以及配置MySQL支持等步骤,适合后端开发者参考。 ... [详细]
  • 正在学习操作系统开发,遇到一个内核在GRUB Legacy(0.97)中无法成功引导的问题。具体表现为输入内核命令后显示错误信息,尝试引导时GRUB挂起。 ... [详细]
  • 使用EF Core在.Net Core控制台应用中操作SQLite数据库
    本文介绍如何利用Visual Studio 2019和Windows 10环境,通过Entity Framework Core(EF Core)实现对SQLite数据库的读写操作。项目源代码可从百度网盘下载。 ... [详细]
  • Qt应用开发:创建基本窗口
    本文介绍如何使用Qt框架创建基础窗口的两种方法。第一种方法直接在main函数中创建并显示窗口;第二种方法通过定义一个继承自QWidget的类来实现更复杂的功能。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 本文介绍了如何在Spring框架中配置和使用定时任务,包括初始化配置和动态启动定时器的方法。通过示例代码展示了如何利用Spring的TaskScheduler接口来创建和管理定时任务。 ... [详细]
  • 本文详细介绍了在Mac操作系统中使用Python连接MySQL数据库的方法,包括常见的错误处理及解决方案。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 华为云openEuler环境下的Web应用部署实践
    本文详细记录了在华为云openEuler系统上进行Web应用部署的具体步骤,包括配置yum源、安装Apache、MariaDB、PHP及其相关组件,并完成WordPress的安装与配置过程。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
author-avatar
于浮浅
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有