12

I was just on vacation for a month so am unable to say the exact point at which this happened, but R from the official Arch repos is now unable to start, citing

/usr/lib64/R/bin/exec/R: error while loading shared libraries: 
libgfortran.so.3: cannot open shared object file: No such file or directory

I thought that perhaps a symlink was improperly placed or destroyed, so I looked in /usr/lib to try to find it:

ls -halt /usr/lib/libgfortran.so.*

lrwxrwxrwx 1 root root   20 May 16 03:01 /usr/lib/libgfortran.so.4 -> libgfortran.so.4.0.0
-rwxr-xr-x 1 root root 7.1M May 16 03:01 /usr/lib/libgfortran.so.4.0.0

Has libfortran.so.3 been superseded by libgfortran.so.4 in Arch? If so, are there any possible workarounds for getting R to run with an older version?


pacman -Qi r

Name            : r
Version         : 3.4.0-2
Description     : Language and environment for statistical computing and graphics
Architecture    : x86_64
URL             : http://www.r-project.org/
Licenses        : GPL
Groups          : None
Provides        : None
Depends On      : blas  lapack  bzip2  libpng  libjpeg  libtiff  ncurses  pcre  readline  zlib  perl  gcc-libs  libxt  libxmu  pango  xz  desktop-file-utils  zip  unzip
Optional Deps   : tk: tcl/tk interface [installed]
                  texlive-bin: latex sty files [installed]
Required By     : None
Optional For    : graphviz
Conflicts With  : None
Replaces        : None
Installed Size  : 58.04 MiB
Packager        : Evangelos Foutras <evangelos@foutrelis.com>
Build Date      : Tue 25 Apr 2017 05:04:31 AM EDT
Install Date    : Tue 20 Jun 2017 12:27:06 PM EDT
Install Reason  : Explicitly installed
Install Script  : No
Validated By    : Signature

Edit: If anyone else comes across this, the r-devel AUR correctly compiles and runs, so hopefully on the next version bump the issue will be resolved.

4

6 回答 6

8

事实上,gfortran 7 将 ligfortran 版本提升到版本 4。请参阅http://gcc.1065356.n8.nabble.com/patch-fortran-PR77828-Linking-gfortran-7-compiled-program-with-libgfortran-of-5 -x-allowed-but-crashes-td1311625.html 它不向后兼容,并且某些 API 已更改。

如果您安装旧版本的 gfortran,您将获得 libgfortran.so.3。在您的系统中有多个版本是完全可以的。也许有一种方法可以为版本 4 重建 R,但它可能会做更多的工作。查看其他答案如何重建软件https://stackoverflow.com/a/50744705/721644

于 2017-06-20T19:25:22.327 回答
2

我在一个名为 pyferret 的软件上工作,它需要libgfortran.so.3. 我正在运行 fedora 27,其包管理器默认安装 gfortran 7(更高版本)。libgfortran.so.4这会在中生成共享对象/usr/lib64。然而,另一个运行 Ubuntu 16.04.3 的 Linux 系统具有libgfortran.so.3. 我将它复制到我的系统中 ~/pkgs/libs 并运行应用程序

export LD_PRELOAD=/home/vasu/pkgs/libs/libgfortran.so.3:/home/vasu/pkgs/libs/libopenblas.so.0;pyferret

这在没有上述错误的情况下有效。

于 2017-11-21T12:04:45.633 回答
1

每当 libgfortran 收到不兼容的 soname 碰撞时,此问题就会定期发生,主要是因为在 R 世界中,blas/lapack 被 AUR 的替代实现替换是很常见的。

这里要注意的重要一点是,实际上并不是 R 有错误

此处的免责声明:我在这里与我的官方 Arch Linux bugwrangler 帽子交谈,这就是我试图追查此类问题的方式。(这也是我检查错误报告是否应该被关闭为无效的方式。)

使用我得心应手的 Arch Linux bugwrangler 实用工具pkg-list-linked-libraries(它按照它在锡上说的做):

$ pkg-list-linked-libraries r libgfortran.so
==> checking linked libraries for r-3.5.1-2-x86_64.pkg.tar.xz ...
==> ERROR: No file in r-3.5.1-2-x86_64.pkg.tar.xz is linked to libgfortran.so

那么,如果它不是来自R自身,它是从哪里来的呢?使用该工具lddtree(来自 pax-utils)不仅显示可执行文件所需的库(就像这样ldd做),而且还以树形格式向您展示为什么需要它们:

$ lddtree /usr/lib/R/bin/exec/R
/usr/lib/R/bin/exec/R (interpreter => /lib64/ld-linux-x86-64.so.2)
    libR.so => /usr/lib/R/lib/libR.so
        libblas.so.3 => /usr/lib/libblas.so.3
            libgfortran.so.5 => /usr/lib/libgfortran.so.5
                libquadmath.so.0 => /usr/lib/libquadmath.so.0
                libgcc_s.so.1 => /usr/lib/libgcc_s.so.1
        libm.so.6 => /usr/lib/libm.so.6
        libreadline.so.7 => /usr/lib/libreadline.so.7
            libncursesw.so.6 => /usr/lib/libncursesw.so.6
        libpcre.so.1 => /usr/lib/libpcre.so.1
        liblzma.so.5 => /usr/lib/liblzma.so.5
        libbz2.so.1.0 => /usr/lib/libbz2.so.1.0
        libz.so.1 => /usr/lib/libz.so.1
        libtirpc.so.3 => /usr/lib/libtirpc.so.3
            libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2
                libkrb5support.so.0 => /usr/lib/libkrb5support.so.0
                libkeyutils.so.1 => /usr/lib/libkeyutils.so.1
                libresolv.so.2 => /usr/lib/libresolv.so.2
            libkrb5.so.3 => /usr/lib/libkrb5.so.3
            libk5crypto.so.3 => /usr/lib/libk5crypto.so.3
            libcom_err.so.2 => /usr/lib/libcom_err.so.2
        librt.so.1 => /usr/lib/librt.so.1
        libdl.so.2 => /usr/lib/libdl.so.2
        libicuuc.so.62 => /usr/lib/libicuuc.so.62
            libicudata.so.62 => /usr/lib/libicudata.so.62
            libstdc++.so.6 => /usr/lib/libstdc++.so.6
        libicui18n.so.62 => /usr/lib/libicui18n.so.62
        libgomp.so.1 => /usr/lib/libgomp.so.1
    libpthread.so.0 => /usr/lib/libpthread.so.0
    libc.so.6 => /usr/lib/libc.so.6

这里的相关位是开始:

/usr/lib/R/bin/exec/R (interpreter => /lib64/ld-linux-x86-64.so.2)
    libR.so => /usr/lib/R/lib/libR.so
        libblas.so.3 => /usr/lib/libblas.so.3
            libgfortran.so.5 => /usr/lib/libgfortran.so.5

如果我删除 libgfortran 库,因为这是一个测试 chroot,我不在乎它会发生什么,我看到:

/usr/lib/R/bin/exec/R (interpreter => /lib64/ld-linux-x86-64.so.2)
    libR.so => /usr/lib/R/lib/libR.so
        libblas.so.3 => /usr/lib/libblas.so.3
            libgfortran.so.5 => None

这清楚地表明是 libblas.so 在查找 libgfortran.so 时出错,从那里您可以检查哪个 pacman 包拥有损坏的 libblas.so - 如果它确实是官方存储库包,那么您可以报告错误以修复它,如果没有,那么现在您知道要自己重新编译哪个 AUR 包。

于 2018-08-13T17:50:45.913 回答
1

问题可能来自一些在 GCC 更新后尚未重建的 AUR 包。就我个人而言,可能是包openblas-lapack搞砸了(参见https://bbs.archlinux.org/viewtopic.php?id=236900)。所以可能不需要安装任何以前版本的 GCC。

我所做的是:

  1. 更新我所有的 AUR 包 ( yaourt -Syua)
  2. 然后重建 R ( pacman -S r)

它再次起作用。

于 2018-06-07T15:11:47.733 回答
1

R 中有许多依赖于 GCC Fortran 的包。其中一些尚未更新以针对新的 GCC 进行编译,而一些依赖于这些的包得到更新,deldir 和 robustbase 就是两个例子。

检查您的警告并安装任何无法加载的软件包,然后执行升级。

于 2018-02-10T13:31:33.400 回答
0

我不能肯定地说 Arch-Linux,但在 Ubuntugfortran中包含的标准存储库集上提供了多个版本的库。apt

当更改为 18.04 (LTS) 时,我必须在库的默认版本 4 旁边安装以前的版本。

对我来说,以下命令解决了这个问题: sudo apt-get install libgfortran3

如果您的包有一段时间没有维护,重建 R 中的所有包可能无法解决问题,就像我的情况一样。

于 2018-08-07T17:13:56.457 回答