R语言中GCC编译的问题
不仅仅编译R语言本身会非常的麻烦,实际上还有些R包为了提高运行速度将一些功能封装到C/C++中,随后在安装的时候会进行编译。
编译通过则万事大吉,如果不通关就是一番折腾。比如说我最近在服务器上安装DESeq2
就遇到了这种事情,下面是解决的过程。
并不是所有的warning都可以忽视,比如说如下这种就不行。因为他说DESeq2的编译结果是“非零返回”,也就是失败了。而失败的原因则是前面这个包都失败了。
source("http://bioconductor.org/biocLite.R") biocLite("DESeq2")
那我们逐个解决,使用install.packages("RCurl")
安装第一个失败的包。
上面的报错信息cannot find -lxxx
告诉我们,由于缺少两个动态库,xml和iconv, 导致编译不通过。那我们借助百度去安装这两个包,以xml为例
# xml2 wget -4 ftp://xmlsoft.org/libxml2/libxml2-git-snapshot.tar.gz tar xf libxml2-git-snapshot.tar.gz cd libxml2-2.9.7/ ./configure --prefix=$HOME/opt/sysoft/libxml2-2.9.7 CFLAGS=-I$HOME/opt/anaconda2/include/python2.7/ make && make install # iconv wget -4 https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz tar xf libiconv-1.15.tar.gz cd libiconv-1.15 ./configure --prefix=$HOME/opt/sysoft/libiconv-1.15 make && make install
编译libxml需要Python的头文件,选择自己的Python安装路径。
安装完之后,还是无法直接使用R安装,因为R不知道我们把这些软件装在了哪里。解决方案就是在家目录下新建一个文件夹.R
,然后在其中创建一个文件Makevars
.
Makevars的语法和Makefile一致,在编译的时候里面的变量会成为编译工具的参数。
The most common use of a Makevars file is to set additional preprocessor options (for example include paths) for C/C++ files via
PKG_CPPFLAGS
, and additional compiler flags by settingPKG_CFLAGS
,PKG_CXXFLAGS
,PKG_FFLAGS
orPKG_FCFLAGS
, for C, C++, FORTRAN or Fortran 9x respectively (see Creating shared objects).
由于我的服务器管理员安装的工具不多,所以我自己安装了很多工具,也就有很多的路径要添加。
CXXSTD = -std=gnu11 # dynamic link library LIBGCC = -L$(HOME)/opt/sysoft/gcc-4.9.0/lib64 -Wl,-R$(HOME)/opt/sysoft/gcc-4.9.0/lib64 LIBEXPAT = -L$(HOME)/opt/sysoft/expat-2.2.5/lib -Wl,-R$(HOME)/opt/sysoft/expat-2.2.5/lib OPENMPI = -L$(HOME)/opt/sysoft/openmpi-3.0.0/lib -Wl,-R$(HOME)/opt/sysoft/openmpi-3.0.0/lib BZIP2 = -L$(HOME)/opt/sysoft/bzip2-1.06/lib -Wl,-R$(HOME)/opt/sysoft/bzip2-1.06/lib XZ = -L$(HOME)/opt/sysoft/xz-5.2.3/lib -Wl,-R$(HOME)/opt/sysoft/xz-5.2.3/lib ZLIB = -L$(HOME)/opt/sysoft/zlib-1.2.11/lib -Wl,-R$(HOME)/opt/sysoft/zlib-1.2.11/lib CURL = -L$(HOME)/opt/sysoft/curl-7.56.1/lib -Wl,-R$(HOME)/opt/sysoft/curl-7.56.1/lib/ ICONV = -L$(HOME)/opt/sysoft/libiconv-1.15/lib -Wl,-R$(HOME)/opt/sysoft/libiconv-1.15/lib XML2 = -L$(HOME)/opt/sysoft/libxml2-2.9.7/lib -Wl,-R$(HOME)/opt/sysoft/libxml2-2.9.7/lib LDFLAGS := $(LIBGCC) $(LIBEXPAT) $(BZIP2) $(XZ) $(ZLIB) $(CURL) $(ICONV) $(XML2)
之后在编译XML时候,出了一个小问题,后来发现是因为编译XML需要xml2-config
,这个工具位于我们刚刚编译的libxml2-2.9.7/bin
下,所以将该目录添加到环境PATH中即可。
解决依赖包之后,DESeq2
的也终于安装上去了。
参考资料:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python面向对象笔记
一、封装(属性/私有方法/公有方法/静态方法/构造函数...) # 定义一个类 class Animal: # 私有成员(用_开头的约定为私有成员 - 注:仅仅是君子协定) _age = 0 # 构造函数 def __init__(self, name): # 建议所有私有成员在这里初始化(不管是已定义的,还是"动态"添加的) self.name = name # 动态添加的私有成员 self._age = 1 # 已经定义好的私有成员 # 静态方法 @staticmethod def eat(): print("Animal can eat food") # 公有方法 def to_string(self): return "name:" + self.name # 私有方法(用_开头的约定为私有方法 - 注:仅仅是君子协定) def _some_method(self): return "this is a private method of :" + self.name # setter示例 def set_age(self, age): if age < 0 or age...
- 下一篇
Java抽象类与接口的区别
看到题目的时候,你掌握这个知识点了吗? 图片来源与网络 常见面试问题如下: 接口和抽象类的区别,什么时候使用? 抽象类和接口的相同点和不同点? 总之就是经常问到的问题了。官方文档有句很逗的话,说给面试官听,估计很有意思。 Java语言规范 所有的接口都是隐式的抽象声明。 Abstract class vs Interface 抽象类与接口都是用于功能的抽象。 方法: 接口只能有抽象方法,抽象类可以有抽象方法和非抽象方法。Java8以后,接口可以直接定义default和static方法了。抽象类可以有protect和private方法。 成员变量:接口中的成员变量默认是static和final的,抽象类可以像常规的对象一样定义各种成员变量。可以是非static和final的 实现:接口不能实现其他的接口,只能继承一个其它的接口。抽象类可以实现多个接口。 构造器:抽象类可以有构造器,接口不能有构造器。 main方法: 抽象类可以有main方法,并且我们可以运行它。接口不能有main方法。 速度:抽象类速度更快一些,接口需要时间寻找类中的实现方法。 使用场景 Java8以后可以直接在接口中定...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路