Conda 环境下 R 源码包编译安装失败的通用解决方案
典型报错
在 R session 内使用 install.packages() 安装源码包时,报错类似:
x86_64-conda-linux-gnu-cc: command not found
Configuration failed because libXXX was not found.
常见于 curl、openssl、xml2、sf、igraph 等需要系统库的 R 包。
原因
install.packages() 在 R 内部启动子进程进行编译。即使你已经 conda activate 了环境,R session(尤其通过 RStudio 或 IDE 启动的)不一定继承 conda 的环境变量(PATH、PKG_CONFIG_PATH、LD_LIBRARY_PATH 等),导致:
- 找不到 conda 安装的 C/C++ 编译器(
x86_64-conda-linux-gnu-cc) - 找不到 conda 安装的系统库头文件(
libcurl、libssl等)
解决方案
方法 1:在 conda shell 中用 R CMD INSTALL(推荐)
确保在终端中先激活 conda 环境,再用命令行安装:
conda activate r442
# 安装到指定 library 路径
R CMD INSTALL --library=/path/to/your/R/library /path/to/package.tar.gz
# 示例
R CMD INSTALL --library=/s1/SHARE/01_software/R_432_SeuratV5/library \
/s1/SHARE/01_software/R_432_SeuratV5/library/curl_7.0.0.tar.gz
R CMD INSTALL 直接在 shell 中执行,完整继承 conda 环境变量,编译器和系统库都能正确找到。
方法 2:用 conda 安装二进制版 R 包(免编译)
conda activate r442
conda install -c conda-forge r-curl r-openssl r-xml2 # 按需替换包名
conda 的 R 包以 r- 为前缀,安装的是预编译二进制版本,不需要本地编译。包会装在 conda 的 R library 路径下(如 /s1/mengzijun/anaconda3/envs/r442/lib/R/library),只要 .libPaths() 包含该路径即可使用。
方法 3:在 R session 内手动设置环境变量
如果必须用 install.packages(),可以在 R 里先设置环境变量:
# 将 conda 环境的 bin 和 lib 加入 PATH
conda_prefix <- "/s1/mengzijun/anaconda3/envs/r442"
Sys.setenv(
PATH = paste(file.path(conda_prefix, "bin"), Sys.getenv("PATH"), sep = ":"),
PKG_CONFIG_PATH = paste(file.path(conda_prefix, "lib/pkgconfig"), Sys.getenv("PKG_CONFIG_PATH"), sep = ":"),
LD_LIBRARY_PATH = paste(file.path(conda_prefix, "lib"), Sys.getenv("LD_LIBRARY_PATH"), sep = ":")
)
# 然后再安装
install.packages("/path/to/package.tar.gz", repos = NULL, type = "source")
前置依赖:确保 conda 环境有编译工具链
无论用哪种方法,conda 环境里需要有编译器和对应的系统库:
conda activate r442
# 编译工具链
conda install -c conda-forge c-compiler cxx-compiler pkg-config
# 常见 R 包需要的系统库(按需安装)
conda install -c conda-forge libcurl openssl libxml2 glpk
运行时依赖:LD_LIBRARY_PATH
编译安装成功后,运行时如果报 cannot open shared object file(如 libglpk.so.40),需要确保 LD_LIBRARY_PATH 包含 conda 的 lib 目录:
# 方式 1:激活 conda 环境后运行(自动设置)
conda activate r442
Rscript your_script.R
# 方式 2:在 shell 脚本开头手动 export
export LD_LIBRARY_PATH=/s1/mengzijun/anaconda3/envs/r442/lib:$LD_LIBRARY_PATH
常见包与系统库对照表
| R 包 | 需要的系统库 | conda 安装命令 |
|---|---|---|
| curl | libcurl | conda install -c conda-forge libcurl |
| openssl | openssl | conda install -c conda-forge openssl |
| xml2 | libxml2 | conda install -c conda-forge libxml2 |
| sf | gdal, geos, proj | conda install -c conda-forge gdal geos proj |
| igraph | glpk | conda install -c conda-forge glpk |
| textshaping | harfbuzz, fribidi | conda install -c conda-forge harfbuzz fribidi |
| ragg | freetype, libpng, libtiff | conda install -c conda-forge freetype libpng libtiff |
总结
优先级:方法 1 (R CMD INSTALL) > 方法 2 (conda 二进制) > 方法 3 (R 内设环境变量)
核心原则:编译源码包时,确保编译器和系统库对 R 的子进程可见。