/usr/bin/ld: 在 R 中安装“RcppArmadillo”时找不到 -lgfortran

Posted

技术标签:

【中文标题】/usr/bin/ld: 在 R 中安装“RcppArmadillo”时找不到 -lgfortran【英文标题】:/usr/bin/ld: cannot find -lgfortran when installing 'RcppArmadillo' in R 【发布时间】:2017-02-10 03:10:55 【问题描述】:

主要目标是使用 DiffBind(一个 R 包)来分析我的 ChIPseq 数据。

(我发现another post 可能与我的问题有关,并试图从中提取解决方案,但我想内容对我来说太“高级”了......)

按照我might need to update my DiffBind的建议 我试图安装它的新版本。

通过检查dependency of DiffBind,我猜测之前的安装会自动安装旧版本的 DiffBind,因为我的 R 不符合当前版本的 DiffBind 的要求。

但我使用的是根目录下的 R,对此我无能为力。所以我决定在我自己的目录下安装一个更新版本的 R。我managed to do that.

然后我尝试安装当前版本的 DiffBind,我得到了错误

ERROR: compilation failed for package ‘RcppArmadillo’

原来依赖库“RcppArmadillo”需要更新的编译器,我再次使用根目录下的 gcc 编译器,所以我在自己的目录下安装了新版本的 gcc。

    $ gcc --version

    gcc (GCC) 6.1.0

    Copyright (C) 2016 Free Software Foundation, Inc.

    This is free software; see the source for copying conditions.  There is NO

    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    $ which gcc

/$HOME/Programme/gcc-6.1.0/bin//gcc

之后我再次尝试安装 DiffBind (RcppArmadillo),但遇到了另一个错误:

* installing *source* package ‘RcppArmadillo’ ...
**   package 'RcppArmadillo' successfully unpacked and MD5 sums checked 
checking whether the C++ compiler works... yes
checking for C++ compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking how to run the C++ preprocessor... g++ -E
checking whether we are using the GNU C++ compiler... (cached) yes
checking whether g++ accepts -g... (cached) yes
checking whether g++ version is sufficient... (6.1.0) yes
checking LAPACK_LIBS... fallback LAPACK from R 3.3.0 or later used
configure: creating ./config.status
config.status: creating inst/include/RcppArmadilloLapack.h
** libs
g++ -I/$HOME/Programme/R-3.3.1/lib64/R/include -DNDEBUG  -I//$HOME/Programme/zlib-1.2.11/include -I//$HOME/Programme/bzip2-1.0.6/include -I//$HOME/Programme/xz-5.2.3/include -I//$HOME/Programme/pcre-8.40/include -I//$HOME/Programme/curl-7.52.1/include -I"/$HOME/Programme/R-3.3.1/lib64/R/library/Rcpp/include"  -I../inst/include -fpic  -g -O2  -c RcppArmadillo.cpp -o RcppArmadillo.o
g++ -I/$HOME/Programme/R-3.3.1/lib64/R/include -DNDEBUG  -I//$HOME/Programme/zlib-1.2.11/include -I//$HOME/Programme/bzip2-1.0.6/include -I//$HOME/Programme/xz-5.2.3/include -I//$HOME/Programme/pcre-8.40/include -I//$HOME/Programme/curl-7.52.1/include -I"/$HOME/Programme/R-3.3.1/lib64/R/library/Rcpp/include"  -I../inst/include -fpic  -g -O2  -c RcppExports.cpp -o RcppExports.o
g++ -I/$HOME/Programme/R-3.3.1/lib64/R/include -DNDEBUG  -I//$HOME/Programme/zlib-1.2.11/include -I//$HOME/Programme/bzip2-1.0.6/include -I//$HOME/Programme/xz-5.2.3/include -I//$HOME/Programme/pcre-8.40/include -I//$HOME/Programme/curl-7.52.1/include -I"/$HOME/Programme/R-3.3.1/lib64/R/library/Rcpp/include"  -I../inst/include -fpic  -g -O2  -c fastLm.cpp -o fastLm.o
g++ -shared -L/$HOME/Programme/R-3.3.1/lib64/R/lib -L//$HOME/Programme/zlib-1.2.11/lib -L//$HOME/Programme/bzip2-1.0.6/lib -L//$HOME/Programme/xz-5.2.3/lib -L//$HOME/Programme/pcre-8.40/lib -L//$HOME/Programme/curl-7.52.1/lib -o RcppArmadillo.so RcppArmadillo.o RcppExports.o fastLm.o -L/$HOME/Programme/R-3.3.1/lib64/R/lib -lRlapack -L/$HOME/Programme/R-3.3.1/lib64/R/lib -lRblas -lgfortran -lm -L/$HOME/Programme/R-3.3.1/lib64/R/lib -lR
/usr/bin/ld: cannot find -lgfortran
collect2: error: ld returned 1 exit status**

原来gfortran 找不到。 但是当我检查gfortran 的存在时它存在:

$ which gfortran

/usr/bin/gfortran

$ gfortran --version 

GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-17)

Copyright (C) 2010 Free Software Foundation, Inc.



GNU Fortran comes with NO WARRANTY, to the extent permitted by law.

You may redistribute copies of GNU Fortran

under the terms of the GNU General Public License.

For more information about these matters, see the file named COPYING

所以我假设 gcc 找不到根目录下的 gfortran。 我该如何解决这个问题? 还是 gcc 和 gfortran 之间的不匹配可能是问题所在?如果是这种情况,可以采取什么措施来规避它?

我的 R 版本:

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server release 6.7 (Santiago)

locale:
 [1] LC_CTYPE=ja_JP.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=ja_JP.UTF-8        LC_COLLATE=ja_JP.UTF-8    
 [5] LC_MONETARY=ja_JP.UTF-8    LC_MESSAGES=ja_JP.UTF-8   
 [7] LC_PAPER=ja_JP.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=ja_JP.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base   

【问题讨论】:

您的 g++ 是 6.1 版,但 gfortran 是非常旧的 4.4。这很奇怪。如果你安装了新的 GCC,你应该完全安装它,包括 Fortran 部分。 @VladimirF。嗨弗拉基米尔。 gfortran 安装在根目录中,而 gcc 是我自己安装在我自己的目录中的。这或许可以解释为什么 g++ 和 gfortran 的版本不匹配。您的评论似乎暗示如果安装了新的 GCC,将自动安装 Fortran。所以我想我搞砸了,或者错过了一些选择。你对此有什么想法吗? Gfortran 是 GCC 包的一部分。这是一个可选部分,但在这种情况下,您确实希望将其包含在内。这取决于您安装 GCC 的方式。 @VladimirF。我发现一个帖子link 似乎有类似的问题。我不太确定,但在我看来,我没有在“--enable-languages =”选项部分添加“fortran”,也没有在gcc的源目录中调用“./contrib/download_prerequisites” “制作”命令。现在我已经删除了以前的 GCC,并使用“./contrib/download_prerequisites”和“../gcc-6.1.0/configure --prefix$HOME/Programme/gcc-6.1.0 --enable-languages”重新安装它=c,c++,fortran --disable-multilib" @VladimirF,你认为这行得通吗?或者还有什么我应该做的吗?现在我正在等待“make”命令完成,这需要相当长的时间...... 【参考方案1】:

我认为这里提到的问题已经解决了。 正如 Cmets 中 VladimirF 提到的,当我安装新版本的 gcc 时,我没有启用 Fortran,这不是默认设置,因此在我之前的尝试中没有安装 gfortran。

我删除了之前的gcc,重新编译如下:

tar -xvf gcc-6.1.0.tar.gz
cd gcc-6.1.0
./contrib/download_prerequisites 
mkdir build
cd build
../configure --prefix=$HOME/Programme/gcc-6.1.0 --enable-languages=c,c++,fortran --disable-multilib
make -j 8
make install

为新的 gcc 和 lib 设置路径

成功了!

【讨论】:

以上是关于/usr/bin/ld: 在 R 中安装“RcppArmadillo”时找不到 -lgfortran的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu 14.04 LTS 中安装 ia32-libs (Trusty Tahr)

/usr/bin/ld: 找不到 -ldlib /usr/bin/ld: 找不到 -lcblas /usr/bin/ld: 找不到 -llapack

/usr/bin/ld: cannot find -llzma /usr/bin/ld: cannot find -lbz2

gcc 错误“/usr/bin/ld: 找不到 -lstdc++”

/usr/bin/ld: 在 Makefile 中找不到 -lioutil

/usr/bin/ld: 找不到 -lpthreads