R v3.4.0-2无法在Arch上找到libgfortran.so.3

时间:2017-06-20 16:48:54

标签: r gfortran archlinux pacman-package-manager

我刚刚度假一个月,所以我无法说明发生这种情况的确切时间点,但官方Arch repos的R现在无法启动,引用

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

我认为也许一个符号链接被错误地放置或销毁,所以我查看/ usr / lib试图找到它:

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

Arch中的libfortran.so.3已取代libgfortran.so.4吗?如果是这样,是否有任何可能的解决方法让R与旧版本一起运行?

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

编辑:如果有其他人遇到此问题,r-devel AUR会正确编译并运行,因此希望在下一版本问题上解决问题。

6 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

这没有上述错误。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

问题可能来自一些在GCC更新后尚未重建的AUR软件包。在我个人的案例中,可能是包裹openblas-lapack混乱(见https://bbs.archlinux.org/viewtopic.php?id=236900)。 因此可能无需安装任何以前版本的GCC。

我做的是:

  1. 更新我的所有AUR套餐(yaourt -Syua
  2. 然后重建R(pacman -S r
  3. 它再次起作用。

答案 4 :(得分:0)

对于Arch-Linux,我不确定,但是gfortran库的多个版本在Ubuntu上apt附带的标准存储库中可用。

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

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

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

答案 5 :(得分:0)

每当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软件包了。