解决一个安装R包以后libgfortran链接库丢失的问题

前一阵子工作比较忙,因此博客疏于打理,见谅。好在今天开始终于休假了!最近应该更新会比较频繁。

休假前,依然碰到了几个程序方面的小问题——不过现在已经解决啦!下面是debug的记录,放在这里,也供有需要的朋友参考awa


问题描述

某天,因为分析数据需要,我在服务器的miniconda环境下安装了一些软件包:

1
2
3
conda repoquery depends -c bioconda r-bpcells
conda install bioconda::r-bpcells
conda install bioconda::r-monocle3

安装过程很顺利,但是在安装完这些之后,我的R出问题了:

1
2
3
4
5
6
(base) ~$ Rscript --version
Rscript (R) version 4.4.1 (2024-06-14)
(base) ~$ R --version
/home/zhangwanyu/miniconda3/lib/R/bin/exec/R: error while loading shared libraries: libgfortran.so.5: cannot open shared object file: No such file or directory
(base) ~$ R
/home/zhangwanyu/miniconda3/lib/R/bin/exec/R: error while loading shared libraries: libgfortran.so.5: cannot open shared object file: No such file or directory

base环境下的python也出了问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(base) ~$ python
Python 3.9.18 | packaged by conda-forge | (main, Aug 30 2023, 03:49:32)
[GCC 12.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
Traceback (most recent call last):
File "/home/zhangwanyu/miniconda3/lib/python3.9/site-packages/numpy/core/__init__.py", line 24, in <module>
from . import multiarray
File "/home/zhangwanyu/miniconda3/lib/python3.9/site-packages/numpy/core/multiarray.py", line 10, in <module>
from . import overrides
File "/home/zhangwanyu/miniconda3/lib/python3.9/site-packages/numpy/core/overrides.py", line 8, in <module>
from numpy.core._multiarray_umath import (
ImportError: libgfortran.so.5: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/zhangwanyu/miniconda3/lib/python3.9/site-packages/numpy/__init__.py", line 130, in <module>
from numpy.__config__ import show as show_config
File "/home/zhangwanyu/miniconda3/lib/python3.9/site-packages/numpy/__config__.py", line 4, in <module>
from numpy.core._multiarray_umath import (
File "/home/zhangwanyu/miniconda3/lib/python3.9/site-packages/numpy/core/__init__.py", line 50, in <module>
raise ImportError(msg)
ImportError:

看起来是fortran动态链接库(libgfortran.so.5)出了问题。这可真是件麻烦事啊。

排查与解决

(一)排查思路

在Linux系统下,.so文件是一类动态链接库文件,在程序执行时通过 LD_LIBRARY_PATH 环境变量进行寻找和加载。因此,我的思路是这样:

  • 先检查这个动态链接库文件存在的位置
  • 之后修复 LD_LIBRARY_PATH 环境变量,使其可以被正确寻找和加载。

(二)解决过程

1. 找到的libfortran链接库文件的位置:

我检查了libgfortran5的安装情况,conda报告这个包已经安装,但是我在 ~/miniconda3/lib 下面找不到这个库(按理来说它应该在这里的)。这很奇怪,所以我还需要去别的地方找一找。

1
2
3
4
5
(base) [zhangwanyu@lih-svr01]lib$ mamba list | grep libgfortran
WARNING: pip inspect is currently an experimental command. The output format may change in a future release without prior warning.
libgfortran 14.2.0 h69a702a_2 conda-forge
libgfortran-ng 14.2.0 h69a702a_2 conda-forge
libgfortran5 14.2.0 hf1ad2bd_2 conda-forge

此处使用 find 指令,去miniconda根目录下寻找,最终在 pkgs 目录下找到了它们:

1
2
3
4
5
6
7
8
9
10
11
(base) [zhangwanyu@lih-svr01]include$ find ~/miniconda3 -name "libgfortran.so.5"
/home/zhangwanyu/miniconda3/x86_64-conda-linux-gnu/sysroot/lib64/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/libgfortran-ng-8.2.0-hdf63c60_1/lib/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/libgfortran-ng-8.2.0-hdf63c60_1/x86_64-conda_cos6-linux-gnu/sysroot/lib/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/libgfortran5-14.2.0-hf1ad2bd_2/lib/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/libgfortran5-11.2.0-h1234567_1/lib/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/gcc_impl_linux-64-11.2.0-h1234567_1/x86_64-conda-linux-gnu/sysroot/lib64/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/libgfortran5-13.2.0-h43f5ff8_6/lib/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/libgfortran5-13.1.0-h15d22d2_0/lib/libgfortran.so.5
/home/zhangwanyu/miniconda3/pkgs/gcc_impl_linux-64-13.1.0-hc4be1a9_0/x86_64-conda-linux-gnu/lib/libgfortran.so.5
^C

2. 确认这些文件存在

使用 ls -lhF 指令,对上面找到的文件进行检查。有一些文件链接到了无效的文件路径上(下图中红色的文件),这些无效路径也需要处理一下。

image.png

如上图。绿色和浅蓝色的链接库对应着正确的路径;红色则是出现问题的链接路径。

3. 重建软链接 & 使用R验证问题是否解决

其实 LD_LIBRARY_PATH 包含了 ~/miniconda3/lib 这一目录,且后者是miniconda环境下的动态链接库的默认存储位置。因此我们不必修改 LD_LIBRARY_PATH 环境变量,只需要把正确的文件链接到此目录即可。

重建软连接:先切换到 lib 目录,随后使用 ln -s 将正确的文件链接过来:

1
2
(base) [zhangwanyu@lih-svr01]~$ cd ~/miniconda3/lib
(base) [zhangwanyu@lih-svr01]lib$ ln -s /home/zhangwanyu/miniconda3/pkgs/libgfortran5-14.2.0-hf1ad2bd_2/lib/libgfortran.so.5.0.0 libgfortran.so.5

随后使用R验证:

1
2
3
4
5

(base) [zhangwanyu@lih-svr01]lib$ R
R version 4.4.1 (2024-06-14) -- "Race for Your Life"
Copyright (C) 2024 The R Foundation for Statistical Computing
Platform: x86_64-conda-linux-gnu

image.png

完结撒花!