从源代码构建R:共享库的链接失败

时间:2015-09-27 11:42:40

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

我已经摸不着头脑了一个多星期,没有回答我的问题。 我想使用英特尔MKL 1构建 R from cran 源作为共享库。这是我用来测试配置的小脚本:

#! /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. 使用gcc和gfortran在x86_64上构建R
  2. 使用gnu线程构建R
  3. 导出英特尔MKL库的路径
  4. 动态链接BLAS到intel MKL
  5. 现在是我开始生气的部分。 在一个系统 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)
    .......
    

    这正是我要找的。现在,在同一路径中安装了与英特尔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 cache;等仍然无法与Fedora建立正确的链接。

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

1 个答案:

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