2015-09-27 53 views
1

我一直在挠头,超过一个星期,没有回答我的问题。 我想构建R来自cran源与英特尔MKL1作为共享库。下面是我用它来测试我的配置小脚本:从源代码构建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 

这个小脚本执行以下操作:在x86_64用gcc和gfortran

  1. 构建[R
  2. 构建R 2与GNU螺纹
  3. 导出英特尔MKL库的路径
  4. 将BLAS动态链接到英特尔MKL

现在我开始生气的部分。 在一个系统上,的Archlinux,构建会让我用下面的输出LDD build目录

$ 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缓存;等等。仍然无法与Fedora正确连接。

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

回答

1

多次尝试后,下面是正确的脚本构建R-CRAN采用Intel MKL和ICC:

#! /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. 脚本writen并行工作室2016年更改路径 因此如果composerxe 2015.
  2. libRlib和libRblas可以构建为共享或静态库。
  3. 可以添加更多选项进行配置。
  4. 最好的方法是在脚本中输入mklvars和compilervars,这样一旦构建完成,它就不会污染你的shell环境。