构建 R 包时出现错误 "ld: cannot find -lgfortran"。

46

我正在尝试安装 lars 包。我的操作系统是 Ubuntu 11.04 Natty 64 位。在构建时出现以下错误:

* installing *source* package âlarsâ ...
** libs
gfortran   -fpic  -O3 -pipe  -g -c delcol.f -o delcol.o
gcc -shared -o lars.so delcol.o -lgfortran -lm -L/usr/lib64/R/lib -lR
/usr/bin/ld: cannot find -lgfortran
collect2: ld returned 1 exit status
make: *** [lars.so] Error 1
ERROR: compilation failed for package âlarsâ

我已经安装了gfortran,并且运行 gfortran --version 命令可以看到:

gfortran --version GNU Fortran (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

sudo ldconfig -v 命令运行时出现了以下错误:

/sbin/ldconfig.real: Cannot stat /usr/lib/libgfortran.so: No such file or directory

我已经尝试过卸载并重新安装gfortran,但问题仍未解决。请问我需要怎么做才能解决这个问题?


几个问题:1)/usr/lib/libgfortran.so 文件真的存在吗?(如果是符号链接,指向的文件也真的在那里吗?) 2)libgfortran.so 的位置是否在您的 LD_LIBRARY_PATH 中? - geoffjentry
我已检查了源代码。这是标准的 R 构建,没有什么特别的或奇怪的地方。只有一个 Fortran 文件,因此我认为它是标准的 R 构建,试图链接 libgfortran.so。 - Andrew Redd
12个回答

67

当我尝试在Ubuntu 12.10 64位上安装CRAN软件包VGAM时,遇到了同样的问题。 我已经安装了r-base-dev,但是Andrew Redd对Dirk Eddelbuettel答案的第二条评论对我有用。

具体来说,我遇到了两个错误:

/usr/bin/ld: cannot find -lgfortran
/usr/bin/ld: cannot find -lquadmath

这些问题通过这些措施得到解决:

sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 /usr/lib/libgfortran.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libquadmath.so.0 /usr/lib/libquadmath.so

请注意,仅需要处理原始帖子中的第一行即可解决问题。第二行修复了我使用lquadmath时的额外错误。


在Ubuntu 13.10上似乎缺少libgfortran3-dev;对于更新版本,有这样的软件包,但是对于R(来自官方Ubuntu软件包),似乎需要链接到libgfortran.so.3。换句话说,我只能通过手动符号链接解决此问题,因为安装r-base-dev(因此,gfortran软件包)不足以解决问题。 - hans_meine
5
在Ubuntu 14.04上也是一样,我先尝试了Dirk的建议(定期升级R可能是个明智的选择!),以此来解决问题。 - Louis Maddox
也对我有用! - NoBackingDown
在Ubuntu 16.04 LTS上相同。 - Chris
在22.04版本中安装ggforce仍然需要符号链接到libgfortran.so.5。 - Bouncner

46

对于 Debian / Ubuntu 系列,我们通常建议

 $ sudo apt-get install r-base-dev

由于它引入了编译常用的所有软件包,因此这种方法经常被测试,自动化软件包构建器也依赖于此(以及额外的每个软件包的Build-Depends)。在这里也列出了gfortran软件包; 也许您之前安装时链接损坏了,所以我建议您尝试dpkg --purge gfortran; apt-get install gfortran。话虽这样,数十个R软件包(和R本身)都使用Fortran,因此这里没有任何魔法。


1
Dirk,通常你的建议都很准确,但是这里的配置出了一些问题。在问题中,我展示了构建消息。gfortran被找到并用于成功编译delcol.f,但随后又链接到gfortran,而它找不到。 - Andrew Redd
1
你是否碰巧搞乱了不同版本的gcc-*g++-*gfortran-*之间以及它们的库等价物之间的符号链接?有时候所谓的“有趣”的问题只是简单的操作错误。在我的系统中,libgfortran.so.3位于/usr/lib/x86_64-linux-gnu/,来自于libgfortran3软件包。 - Dirk Eddelbuettel
8
是的,我的情况也一样。链接"/usr/lib/libgfortran.so"存在问题,一旦指向正确的"/usr/lib/x86_64-linux-gnu/libfortran.so.3.0.0"后,事情就恢复正常了。 - Andrew Redd
1
小心。我的Ubuntu 11.04没有 /usr/lib/libgfortran.so 链接。尝试 ldconfig -p | grep libgfortran,它应该显示libgfortran.so.3从 /usr/lib/x86_64-linux-gnus 目录中找到。否则我的(相当新的)工作电脑可能有问题 :) - Dirk Eddelbuettel
1
在Ubuntu上,安装r-base-dev对我有用,因为我遇到了与OP相同的错误。 - pocketfullofcheese
显示剩余3条评论

13

看起来其他建议已经解决了你的问题,但是你的问题在我这里也存在,但我的解决方案不同。我的问题是gcc和g++版本与gfortran版本不同。我使用以下方法将它们切换到相同的版本。

  1. 检查你有哪些版本的gcc、g++和gfortran:

    g++ --version
    gcc --version
    gfortran --version
    
  2. 将它们配对,使它们都相同:

    sudo update-alternatives --config g++
    sudo update-alternatives --config gcc
    sudo update-alternatives --config gfortran
    

    在我的情况下,我只有一个版本的gfortran,所以我只需要将g++和gcc的版本更改为与gfortran相匹配的版本即可。


请注意,可能不需要完全匹配:将gcc设置为5.4.1使得gfortran 6.2.0可以正常工作。 - Evpok

9

我使用Centos,但无法获取r-base-dev。我已经安装了gfortran,并且它的版本与gcc和g++的版本匹配,但仍然无法正常工作。然而,我通过创建~/.R/Makevars解决了这个问题,使用以下内容:

cd ~
mkdir .R
touch Makevars

我找到了安装gfortran的目录(显然问题是R找不到它),方法如下:

which gfortran

它说我在 /usr/bin/gfortran 安装了 gfortran。 然后我在.R/Makevars中添加了标志,告诉 R 使用:

F77 = /usr/bin/gfortran
FC = $F77
FLIBS = -L/usr/bin/gfortran

您可以按照以下方式编辑Makevars文件:
vi .R/Makevars

现在,您已经进入了可以编辑文本文件的vi程序。键入i进行编辑,您将在终端窗口底部看到INSERT。然后,您可以输入我上面所写的内容。要保存更改并退出vi,请按esc键,然后键入:wq
我不确定我是否正确放置了FLIBS行,因为它在MacOS上与其他系统非常不同。在MacOS中,有一个gfortran目录下有要链接的库,但显然gfortran在Linux中不是一个目录。至少这对我起作用,并解决了/usr/bin/ld: cannot find -lquadmath的问题,使我顺利安装了需要gfortran的R包。

在CentOS 7上对我非常有效,真是救命稻草!这是Makevars文件,从rstan安装指南中适用的地方进行了修改以供日后参考。if (!file.exists(dotR)) dir.create(dotR) M <- file.path(dotR, "Makevars") if (file.exists(M)) file.remove(M) if (!file.exists(M)) file.create(M) cat("F77 = /usr/bin/gfortran", "FC = $F77", "FLIBS = -L/usr/bin/gfortran", file = M, sep = "\n", append = TRUE) readLines(M) # 安装需要gfortran的软件包 install.packages("bridgesampling")``` - urganmax
这对我在CentOS 7上也有效。感谢分享! - user553965

8

在ubuntu 12.04,R3.1.0,x86 32位(实际上是caret软件包安装的一部分)安装R软件包minqa时遇到了同样的问题。

解决方法:

sudo ln -s /usr/lib/i386-linux-gnu/libgfortran.so.3 /usr/lib/libgfortran.so

r-base-dev重新安装没有起作用,我也没有尝试重新安装gfortran,因为它有很多依赖项。

根据系统/版本不同,

ls -l /usr/lib/libgfortran.so

检查链接是否存在/正确。


在Debian上使用igraph包时,我也遇到了同样的问题。 - fabians
1
请注意,在某些机器上,您可能需要运行 sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 /usr/lib/libgfortran.so(这是我在Linux Mint 18.3上使用的方法)。 - seaotternerd
StackExchange应该考虑更加重视“同一问题的其他有效解决方案”。这个答案对我很有用! - omar

4

如果您在Mac上遇到相同的错误,请尝试以下操作:

安装Homebrew并运行以下命令:

brew install gcc

然后,创建一个文件~/.R/Makevars,其内容如下(请注意,这对应于gcc版本9.1.0):

VER=-9
CC=gcc$(VER)
CXX=g++$(VER)
CFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
CXXFLAGS=-mtune=native -g -O2 -Wall -pedantic -Wconversion
FLIBS=-L/usr/local/Cellar/gcc/9.1.0/lib/gcc/9

  • R版本为3.6.0
  • gcc版本为9.1.0
  • Homebrew版本为2.1.6
  • macOS版本为10.14.5

2

将这里的内容留作以后参考,因为在我的情况下(Amazon Linux EC2 AMI),问题仅仅是符号链接的命名问题,而不是其位置。

sudo ln -s /usr/lib64/libgfortran.so.3 /usr/lib64/libgfortran.so
sudo ln -s /usr/lib64/libquadmath.so.0 /usr/lib64/libquadmath.so

2
我不需要安装任何库。这是我使用的方法,希望对某些人有用。
我在~/.R/Makevars中定义了CC=gcc-8。 我的机器上默认的gcc版本是7.4.0,但我安装了gcc-8。 同时,我没有安装gfortran 8,只有7.4.0。 将Makevars中的该行注释掉会使编译回退到默认的gcc-7,并且成功使用gfortran-7库。"最初的回答"

0

0
我从源代码编译了GCC 7.4,但是配置了--enable-languages=c,c++,这样不会安装Fortran,而Fortran是必需的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接