构建 R 包和错误“ld:找不到 -lgfortran”

Posted

技术标签:

【中文标题】构建 R 包和错误“ld:找不到 -lgfortran”【英文标题】:Building R package and error "ld: cannot find -lgfortran" 【发布时间】:2018-09-21 05:56: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: 无法统计 /usr/lib/libgfortran.so: 没有这样的文件或目录

我已经删除并重新安装了 gfortran。我需要什么来解决这个问题?

【问题讨论】:

几个问题:1)真的有文件/usr/lib/libgfortran.so吗? (如果它是一个符号链接,它指向的文件真的存在吗?) 2) libgfortran.so 的位置是否在您的 LD_LIBRARY_PATH 中? 我检查了来源。这是一个标准的 R 构建,没有什么特别奇怪的。单个 fortran 文件,所以我假设它是标准 R 构建,试图链接 libgfortran.so 【参考方案1】:

尝试在 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 包)是不够的。 在 Ubuntu 14.04 上也是如此,我再次尝试了 Dirk 的建议(无论如何,定期升级 R 可能是明智的!) 也为我工作! 在 Ubuntu 16.04 LTS 上相同。【参考方案2】:

对于 Debian / Ubuntu 系列,我们通常推荐

 $ sudo apt-get install r-base-dev

因为它引入了编译通常需要的所有包。这种方法一直在测试,因为自动化的包构建器依赖于此(以及额外的每个包的 Build-Depends)。 gfortran 包也在此处列出;也许您之前安装的链接断开了,所以我也会尝试dpkg --purge gfortran; apt-get install gfortran。也就是说,数十个 R 包(和 R 本身)使用 Fortran,所以这里不应该有任何魔法。

【讨论】:

Dirk,通常你的建议是正确的,但是这里的配置发生了一些有趣的事情。在问题中,我显示了构建消息。找到 gfortran 并成功编译 delcol.f,但随后再次链接 gfortran,它无法找到。 您是否偶然弄乱了不同的gcc-*g++-*gfortran-* 版本和/或它们的库等价物之间的符号链接? “有趣的事情”有时是简单的操作错误。在我的盒子上,libgfortran.so.3 位于/usr/lib/x86_64-linux-gnu/ 中,来自libgfortran3 包。 是的,我的也是这样。链接 /usr/lib/libgfortran.so 存在问题,一旦正确指向 /usr/lib/x86_64-linux-gnu/libfortran.so.3.0.0,一切都会再次起作用。 小心。我的 Ubuntu 11.04 没有 /usr/lib/libgfortran.so 链接。尝试ldconfig -p | grep libgfortran,它应该显示 libgfortran.so.3 是从/usr/lib/x86_64-linux-gnus 目录中找到的。否则我的(相当新的)工作箱关闭了:) Install r-base-dev 在 ubuntu 上为我解决了问题,但错误与 OP 相同【参考方案3】:

看起来其他建议已经解决了您的问题,但您的问题也适用于我,但在我的情况下解决方案有所不同。我的问题是我的 gcc 和 g++ 版本与我的 gfortran 版本不同。我使用以下方法来切换它们,使它们都相同。

    检查您拥有的 gcc、g++ 和 gfortran 版本:

    g++ --version
    gcc --version
    gfortran --version
    

    匹配它们,使它们都相同:

    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。【参考方案4】:

我使用 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 安装指南以供将来参考。 dotR <- file.path(Sys.getenv("HOME"), ".R") 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) # install a package that requires gfortran install.packages("bridgesampling") 在 CentOS 7 上也适用于我。感谢分享!【参考方案5】:

在 ubuntu 12.04、R3.1.0.、x86 32 位上安装 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 包对我来说也是如此。 请注意,在某些机器上您可能需要运行 sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 /usr/lib/libgfortran.so (这对我来说在 Linux Mint 18.3 上有效) StackExchange 应该考虑更加重视“针对同一问题的其他有效解决方案”。这个答案对我有用!【参考方案6】:

对于任何访问此页面的人在 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 v3.6.0 gcc v9.1.0 自制 v2.1.6 macOS v10.14.5

【讨论】:

【参考方案7】:

仅将其留在这里以供将来参考,就我的情况(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

【讨论】:

【参考方案8】:

我不必安装任何库。发布对我有用的东西,也许对某人有用。

我将~/.R/Makevars 定义为使用CC=gcc-8。 我机器上的默认 gcc 是 7.4.0,但我安装了 gcc-8。 同时我没有gfortran 8,只有7.4.0。 在 Makevars 中注释掉该行会使编译回退到使用默认的 gcc-7,然后它成功地使用了 gfortran-7 lib。

【讨论】:

【参考方案9】:

如果您使用的是 gcc44,则需要:

yum install gcc44-gfortran

【讨论】:

【参考方案10】:

对于未来迷失的灵魂,它还有助于验证编译器版本是否完全匹配(根据https://askubuntu.com/questions/276892/cannot-find-lgfortran)。在我的例子中,gcc 和 gfortran 都是 4.8.4,但 g++ 是 4.6。

【讨论】:

【参考方案11】:

作为 Megatron 对 Mac homebrew 的回答的后续,我在依赖项方面遇到了类似的问题:

错误:“openssl”包配置失败 删除“/usr/local/lib/R/4.1/site-library/openssl” install.packages 中的警告: 软件包“openssl”的安装具有非零退出状态

只需在 bash 中输入 brew install openssl,它就可以在下一个 packages.install 上运行。

【讨论】:

请不要发布重复的答案,而要支持原始答案 它不是重复的,它是指同一类别的不同问题,可以通过使用上述解决方案的另一个实例来解决。但我知道我的解决方案是否应该参考原始问题... 嗨 @bluesdriv3r 欢迎来到 Stack Overflow :) 正如你所说,回答“应该参考原始问题”。为您的问题寻找解决方案的未来读者不太可能查看有关 gfortran 的这个问题,而更有可能查看例如this question about openssl,您的答案将是重复的。 谢谢 :) 我会调查的!

以上是关于构建 R 包和错误“ld:找不到 -lgfortran”的主要内容,如果未能解决你的问题,请参考以下文章

如何运行使用旧版本包和最新 R 版本和包中的 R 编写的 R 脚本? [关闭]

R语言使用ggplot2包和plotrix包绘制带有错误条(error bars)的可视化结果:使用ggplot2包绘制具有置信区间的可视化图像使用plotrix包绘制具有置信区间的可视化图像

R语言使用ranger包的ranger函数构建随机森林模型(random forest)

R语言分组绘制频率概率图

R语言dplyr包和tidyr包创建交叉表(列联表crosstab)实战

使用 R 的函数正则匹配错误