【问题标题】:build R from source: links to shared libraries failed从源代码构建 R:指向共享库的链接失败
【发布时间】:2015-10-01 13:51:21
【问题描述】:

一个多星期以来,我一直在摸不着头脑,但我的问题没有得到解答。 我想用 Intel MKL1 作为共享库从 cran 源构建 R。这是我用来测试配置的小脚本:

#! /bin/sh
export MKL=/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl
MKL=" -L${_mkllibpath} \
-Wl,--start-group \
    -lmkl_gf_lp64 \
    -lmkl_gnu_thread \
    -lmkl_core \
-Wl,--end-group \
-lgomp -lpthread"

./configure --prefix=/usr \
--libdir=/usr/lib \
--datarootdir=/usr/share \
rsharedir=/usr/share/R/ \
rincludedir=/usr/include/R/ \
rdocdir=/usr/share/doc/R/ \
--with-blas="${MKL}" \
--with-lapack \
--enable-R-shlib 

make -j4

这个小脚本执行以下操作:

  1. 在 x86_64 上使用 gcc 和 gfortran 构建 R
  2. 使用 gnu 线程构建 R
  3. 导出英特尔 MKL 库的路径
  4. 将 BLAS 动态链接到英特尔 MKL

现在是我开始生气的部分。 在一个系统上,Archlinux,构建将让我在构建目录中运行 ldd 的以下输出

$ ldd bin/exec/R
.....
libmkl_gf_lp64.so => /opt/intel/mkl/lib/intel64/libmkl_gf_lp64.so    (0x00007f7707797000)
libmkl_core.so => /opt/intel/mkl/lib/intel64/libmkl_core.so (0x00007f7705c2a000)
libmkl_gnu_thread.so => /opt/intel/mkl/lib/intel64/libmkl_gnu_thread.so (0x00007f7704ed3000)
libimf.so => /opt/intel/lib/libimf.so (0x00007f7704814000)
libintlc.so.5 => /opt/intel/lib/libintlc.so.5 (0x00007f770284b000)
.......

这正是我正在寻找的。现在,在同一路径中安装了 Intel MKL 的同一脚本,在 Fedora22 上运行。

$ ldd bin/exec/R
linux-vdso.so.1 (0x00007ffe9a9c5000)
libR.so => /usr/lib64/R/lib/libR.so (0x00007f45d9b69000)
libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f45d9947000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f45d972a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f45d936a000)
libblas.so.3 => /lib64/libblas.so.3 (0x00007f45d9111000)
libgfortran.so.3 => /lib64/libgfortran.so.3 (0x00007f45d8de5000)
......

正如所见,根本没有链接到英特尔 MKL。

我玩过各种 make 选项、LD_PATHS、链接器选项等;我检查了环境变量;我检查了 ldconfig 缓存;等等。仍然无法获得与 Fedora 的正确链接。

我会很感激任何提示,在哪里寻找我的问题的根源。

【问题讨论】:

    标签: c++ r shared-libraries fedora intel-mkl


    【解决方案1】:

    经过多次尝试,以下是使用英特尔 MKL 和 ICC 构建 R-cran 的正确脚本:

    #! /bin/sh
    
    source /opt/intel/compilers_and_libraries_2016.0.109/linux/bin/mklvars intel64 
    source /opt/intel/bin/compilervars.sh intel64 
    _icclibpath=/opt/intel/compilers_and_libraries_2016.0.109/linux/compiler/intel64/                    
    _mkllibpath=${MKLROOT}/lib/intel64/
    MKL=" -L${_mkllibpath} -lmkl_rt -lpthread"
    
    export CC="icc"
    export CXX="icpc"
    export AR="xiar"
    export LD="xild"
    export F77="ifort"
    
    export CFLAGS="-g -O3 -xHost -I${MKLROOT}/include"
    export CXXFLAGS="-g -O3 -xHost -I${MKLROOT}/include"
    export FFLAGS="-I${MKLROOT}/include"
    export FCFLAGS="-I${MKLROOT}/include"
    
    # shared libs
    ./configure --with-blas="${MKL}" --enable-R-shlib --enable-BLAS-shlib
    # static libs
    #./configure --with-blas="${MKL}" --with-lapack
    
    make -j4
    

    注意:

    1. 脚本是为 Parallel studio 2016 编写的。更改路径 因此,如果 composerxe 2015。
    2. libRlib 和 libRblas 可以构建为共享或静态库。
    3. 可以添加更多选项进行配置。
    4. 最好是在脚本中获取 mklvars 和 compilervars,这样它就不会 构建完成后污染您的 shell 环境。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 2018-08-22
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2013-04-05
      • 2012-05-31
      • 1970-01-01
      相关资源
      最近更新 更多