首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Intel MKL编译R3.1.1:--启用-R触发符号错误的未定义引用

使用Intel MKL编译R3.1.1:--启用-R触发符号错误的未定义引用
EN

Stack Overflow用户
提问于 2014-09-04 15:19:08
回答 2查看 1.3K关注 0票数 0

问题

为了使用特定的IDE (rstudio),我需要用ICC/MKL (Composer XE 2013 SP 1.3.174)编译R3.1.1和共享库(--启用-rstudio),这样我就会遇到麻烦。

上下文

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

代码语言:javascript
复制
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)编译了R3.1.1(没有共享库)的工作安装程序如下:

代码语言:javascript
复制
$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在进程结束时是空的。

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

代码语言:javascript
复制
$./configure --with-lapack --with-blas="$MKL" --build="x86_64-linux-gnu" --host="x86_64-linux-gnu" --enable-R-shlib

这提供了以下输出:

代码语言:javascript
复制
  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包含以下

代码语言:javascript
复制
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

当我对每个情况下配置脚本的输出运行diff时,都不会出现什么奇怪的情况:

代码语言:javascript
复制
753c753
<   Options enabled:           R profiling
---
>   Options enabled:           shared R library, R profiling

我尝试包含make命令的全部输出,但它超过了允许的最大字符数,因此使用pastebin并不是一个好做法。

如果你觉得有信息缺失,请告诉我,这些信息可以帮助你把我引向正确的方向。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-01 12:51:36

在脚本中添加以下内容为我解决了这个问题:

代码语言:javascript
复制
export MAIN_LDFLAGS='-openmp'

其他的一切都没变。

希望这对其他人有帮助。

票数 0
EN

Stack Overflow用户

发布于 2014-09-23 08:35:59

我一直在针对MKL编译R,这是一个挑战。我还没有在ubuntu上做过这件事,但是从您的配置中可以看出以下四点:

  1. 使用icc对mkl进行编译,通常必须在其中一个mkl目录中源一个shell脚本,以将一组环境变量设置为正确的动态库搜索路径。我看不出你要这么做?
  2. 通过链接到libmkl_rt,可以使您的生活更加轻松。我的配置行(gcc的配置行)使用 -with-blas=“mkl_rt”- BLAS_LIBS="-lmkl_rt -liomp5 -lpthread“
  3. 您试图使用编译器指令启用openmp,而不发送--启用--openmp来配置。
  4. 您正在混合icc和gfortran,而不是为gfortran设置链接指令或库列表。MKL可能不会链接到gfortran,除非它重新编译--英特尔的一些文档说重新编译是必要的;我无法从他们那里得到一个直接的答案。使用您的指令的gfortran似乎不知道您希望它是多线程的,而且它可能不知道如何找到库。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25669214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档