2014-09-04 87 views
0

问题编译使用英特尔MKL - [R 3.1.1:--enable-R-SHLIB触发未定义参考符号错误

我需要编译ř3.1.1与共享库(--enable-R- shlib)与ICC/MKL(Composer XE 2013 SP 1.3.174),以便使用特定的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) 

我以前有[R 3.1.1的工作安装(无共享库)与ICC/MKL(作曲编译XE 2013 SP 1.3.174)如下:

$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 '[email protected]@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 

当我运行配置脚本的输出为每个DIFF情况下,没有什么奇怪的显示出来:

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

我想包括make命令的全部输出,但它超过了允许的最大字符数,并使用引擎收录是不是一个好的做法在SO。

让我知道如果你觉得有信息缺失,可以帮助你带领我走向正确的方向。

谢谢!

回答

0

添加下面的脚本解决了这个问题对我来说:

export MAIN_LDFLAGS='-openmp' 

其他一切保持不变。

希望这对其他人有用。

0

我一直在编译R对付MKL,这是一个挑战。我没有这样做在Ubuntu,但是从配置四件事情我扑过来:

  1. 使用ICC进行编译MKL,通常必须在MKL目录中的一个源一个shell脚本将一堆环境变量设置为正确的动态库搜索路径。我没有看到你在做这个?

  2. 通过链接到libmkl_rt,您可以使您的生活变得更容易lot。 我的配置行(这是GCC)使用

    --with-BLAS = “mkl_rt” --with-LAPACK BLAS_LIBS = “ - lmkl_rt -liomp5 -lpthread”

  3. 你试图启用用编译器指令openmp而不发送--enable-openmp来配置。

  4. 您将icc与gfortran混合,而不是为gfortran设置链接指令或库列表。 MKL可能不会链接到gfortran,除非它重新编译 - 英特尔的一些文档说重新编译是必要的;我无法从他们那里得到直接的答案。 gfortran与你的指令似乎并不知道你希望它是多线程的,它可能不知道如何找到库。