Search code examples
ropenmpiccintel-mkl

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


Problem

I need to compile R 3.1.1 with shared library (--enable-R-shlib) with ICC/MKL (Composer XE 2013 SP 1.3.174) in order to use a specific IDE (rstudio) and I am running into trouble.


Context

Some information about my platform:

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)

I previously had a working installation of R 3.1.1 (without shared library) compiled with ICC/MKL (Composer XE 2013 SP 1.3.174) as follows:

$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

When I run the commands above the compilation is successful and log_make_err is empty at the end of the process.


As I said in the beginning, I now need to compile R with shared library (--enable-R-shlib). Therefore, I tried to use the exact same commands as before (same computer) and changed the configure line to:

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

This gives the following output:

  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

In this case, the compilation is not successful and log_make_err contains the following:

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

When I run diff on the output of the configure script for each case, nothing strange shows up:

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

I tried to include the full output of the make command but it exceeds the maximum number of characters allowed and using pastebin is not a good practice at SO.

Let me know if you feel like there is information missing that could help you lead me in the right direction.

Thanks!


Solution

  • Adding the following to the script solved it for me:

    export MAIN_LDFLAGS='-openmp'
    

    Everything else stayed the same.

    Hopefully this will be useful to someone else.