一、问题背景
在配置SCENIC时运行下列代码,出现报错。
注:Linux服务器,Rstudio server
BiocManager::install(c("AUCell", "RcisTarget"),ask = F,update = F)
二、情况描述
自动下载依赖包阶段正常,所有依赖包都成功下载。
尝试安装sys包时出错,可以正常解压,但是无法安装,显示如下,后续所有包的安装出现相同错误。根据“/bin/sh: 1: x86_64-linux-gnu-gcc: not found”这一提示找到【夜神兔】的解决方案,链接如下:(14条消息) /bin/sh: 1: x86_64-linux-gnu-gcc: not found_夜神兔的博客-CSDN博客
所以根本原因在于没有安装gcc编译器[1]。
操作中的顾虑是师兄之前提到用conda管理所有环境,不能用apt。本人对这两个包管理的方法不是很熟悉,改天详细理一理这两者之间的问题。
在Linux终端执行下列代码,采用apt配置gcc等环境
sudo apt update
sudo apt install build-essential
在终端输入下列代码查找g++、gcc、c++的情况(因为重启R之后仍然出现原先的问题),可找到对应文件,输出如下图
find ~ -name "x86_64-conda-linux-gnu-g++"
find ~ -name "x86_64-conda-linux-gnu-c++"
find ~ -name "x86_64-conda-linux-gnu-gcc"
至此需要重新启动Rstudio,师兄的说法如下:
ps aux | grep rserver | grep -v "grep rserver" | awk '{print $2}' | xargs kill -9
sudo rstudio-server restart
尝试之后的结果是,包是可以安装了,但是Rstudio上R的版本掉到了3.6.(欸先凑活着用吧,过几天再试试把它升回去)
更改Rstudiosever中R版本的问题,可以再xftp中找到rstudioserver的配置文件(位置在/etc/rstudio/rserver.conf),直接添加rsession-which-r变量
rsession-which-r=R新版本的位置
错误的循环:最终又以仅有gnu-cc:not found的形式出现了(没有了c++,g++&gcc的报错)
检查:发现c++,g++,gcc和cc的代码都是在相同的位置,没有差别。问题应该出Rstudio还没有找到这几个编译器,所以采用的方法是将编译器所在的位置添加到路径之中,这里采用的是stackoverflow上解决办法[2]:Unable to compile R packages in Ubuntu Conda environment: x86_64-conda-linux-gnu-c++: not found - Stack Overflow
经过检验,部分包可以安装了,但是仍然会有出现报错的情况,如下:
尝试重新安装第一个无法安装的包,可见如下报错:
在这种情况下还是得耐心点慢慢看
Q1:前三行的内容?
Found pkg-config cflags and libs!
Using PKG_CFLAGS=-I/usr/include/x86_64-linux-gnu
Using PKG_LIBS=-lcurl
“在用第三方库的时候,经常会用到pkg-config这个东西来编译程序”[3]
“使用pkg-config时,选项--cflags 它是用来指定程序在编译时所需要头文件所在的目录;选项 --libs则是指定程序在链接时所需要的动态链接库的目录。”[4]
而libcurl是一个跨平台的开源网络协议库[5],也就是一个第三方库,结合上面的信息也就Make sense了。
尝试使用下列命令安装,显示已经存在(注:libcurl4-openssl-dev不是包,是一个linux 库)
sudo apt-get install libcurl4-openssl-dev
上述情况说明libcurl4-openssl-dev已经存在了,所以是路径的问题。
注:本次提及的问题在stackoverflow上有完全相同的问题:r - 配置失败,因为找不到 libcurl - 堆栈溢出 (stackoverflow.com)
但是上面提到的都是本地编译,可以尝试使用conda安装libcurl,代码如下:
conda install libcurl
而后查看环境变量
echo $PKG_CONFIG_PATH
echo $PATH
发现PKG_CONFIG_PATH为空,没有libcurl.pc文件;并且pkg-config不在path中。
该链接可以解决部分问题,可以通过这个方式安装curl,但是后来仍然有十几个包安装不了。
分享一个装 R 包出错案例 - 简书 (jianshu.com)
最终的解决方案是用动态链接将缺失的库拉过去,但是仍存在个别无法本地编译的包。建议用conda进行包的管理。
四、总结
[1]GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)
[2]stackoverflow上另一个回答也是有参考意义的,可以对照着看看。链接如下:
conda - rstudio-server error: /bin/sh: x86_64-conda_cos6-linux-gnu-cc: 命令未找到 - Stack Overflow
[3]pkg-config原理及用法 - stardsd - 博客园 (cnblogs.com)