繁体   English   中英

使用Intel MKL编译R 3.1.1:--enable-R-shlib触发对符号错误的未定义引用

[英]Compiling R 3.1.1 using Intel MKL: --enable-R-shlib triggers undefined reference to symbol error

问题

我需要使用带有ICC ​​/ MKL(Composer XE 2013 SP 1.3.174)的共享库(--enable-R-shlib)编译R 3.1.1,才能使用特定的IDE(rstudio),但我遇到了麻烦。


语境

有关我的平台的一些信息:

OS: Ubuntu 14.04.1 LTS
Kernel: 3.13.0-30
Compiler: Intel ICC (Composer XE 2013 SP 1.3.174)
MKL: Intel MKL (Composer XE 2013 SP 1.3.174)

我以前有一个用ICC / MKL(Composer XE 2013 SP 1.3.174)编译的R 3.1.1(没有共享库)的有效安装,如下所示:

$source /opt/intel/composerxe/bin/compilervars.sh intel64
$export CC="icc"
$export CXX="icpc"
$export AR="xiar"
$export LD="xild"
$export CFLAGS="-O3 -ipo -openmp -xHost -multiple-processes"
$export CXXFLAGS="-O3 -ipo -openmp -xHost -multiple-processes"
$export MKL="-lmkl_gf_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread"
$./configure --with-lapack --with-blas="$MKL" --build="x86_64-linux-gnu" --host="x86_64-linux-gnu" > log_cfg
$make > log_make_out 2> log_make_err
#make install

当我运行上面的命令时,编译成功,并且在过程结束时log_make_err为空。


正如我在一开始所说的,我现在需要使用共享库(--enable-R-shlib)来编译R。 因此,我尝试使用与以前完全相同的命令(同一台计算机),并将配置行更改为:

$./configure --with-lapack --with-blas="$MKL" --build="x86_64-linux-gnu" --host="x86_64-linux-gnu" --enable-R-shlib

这给出以下输出:

  R is now configured for x86_64-pc-linux-gnu

  Source directory:          .
  Installation directory:    /usr/local

  C compiler:                icc -std=gnu99  -O3 -ipo -openmp -xHost -multiple-processes
  Fortran 77 compiler:       gfortran  -g -O2

  C++ compiler:              icpc  -O3 -ipo -openmp -xHost -multiple-processes
  C++ 11 compiler:           icpc  -std=c++11 -O3 -ipo -openmp -xHost -multiple-processes
  Fortran 90/95 compiler:    x86_64-linux-gnu-gfortran -g -O2
  Obj-C compiler:        x86_64-linux-gnu-gcc 

  Interfaces supported:      X11, tcltk
  External libraries:        readline, BLAS(generic), LAPACK(in blas), lzma
  Additional capabilities:   PNG, JPEG, TIFF, NLS, cairo
  Options enabled:           shared R library, R profiling

  Recommended packages:      yes

在这种情况下, 编译不会成功,并且log_make_err包含以下内容

ld: /tmp/ipo_iccUpPSPh.o: undefined reference to symbol '__kmpc_end@@VERSION'
/opt/intel/composer_xe_2013_sp1.3.174/compiler/lib/intel64/libiomp5.so: error adding symbols: DSO missing from command line
make[3]: *** [R.bin] Error 1
make[2]: *** [R] Error 2
make[1]: *** [R] Error 1
make: *** [R] Error 1

当我在每种情况下对configure脚本的输出运行diff时,没有发现奇怪的情况:

753c753
<   Options enabled:           R profiling
---
>   Options enabled:           shared R library, R profiling

我试图包括make命令的完整输出,但是它超过了允许的最大字符数,因此在这种情况下,使用pastebin并不是一个好习惯。

如果您觉得缺少信息可以帮助您将我引向正确的方向,请告诉我。

谢谢!

我一直在针对MKL编译R及其挑战。 我尚未在ubuntu上进行此操作,但是从您的配置中有四件事对我产生了影响:

  1. 使用icc针对mkl进行编译时,通常必须在其中一个mkl目录中获取shell脚本,才能将一堆环境变量设置为正确的动态库搜索路径。 我看不到您正在这样做吗?

  2. 您可以通过对libmkl_rt将您的生活轻松了许多 我的配置行(用于gcc)使用

    --with-blas =“ mkl_rt” --with-lapack BLAS_LIBS =“-lmkl_rt -liomp5 -lpthread”

  3. 您尝试使用编译器指令启用openmp而不发送--enable-openmp进行配置。

  4. 您正在将icc与gfortran混合使用,而不是为gfortran设置链接指令或库列表。 除非重新编译,否则MKL可能不会链接到gfortran。 我不能直接从他们那里得到答案。 带指令的gfortran似乎并不知道您希望它是多线程的,并且它可能不知道如何查找库。

在脚本中添加以下内容可为我解决:

export MAIN_LDFLAGS='-openmp'

其他一切保持不变。

希望这对其他人有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM