[英]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上進行此操作,但是從您的配置中有四件事對我產生了影響:
使用icc針對mkl進行編譯時,通常必須在其中一個mkl目錄中獲取shell腳本,才能將一堆環境變量設置為正確的動態庫搜索路徑。 我看不到您正在這樣做嗎?
您可以通過對libmkl_rt將您的生活輕松了許多 。 我的配置行(用於gcc)使用
--with-blas =“ mkl_rt” --with-lapack BLAS_LIBS =“-lmkl_rt -liomp5 -lpthread”
您嘗試使用編譯器指令啟用openmp而不發送--enable-openmp進行配置。
您正在將icc與gfortran混合使用,而不是為gfortran設置鏈接指令或庫列表。 除非重新編譯,否則MKL可能不會鏈接到gfortran。 我不能直接從他們那里得到答案。 帶指令的gfortran似乎並不知道您希望它是多線程的,並且它可能不知道如何查找庫。
在腳本中添加以下內容可為我解決:
export MAIN_LDFLAGS='-openmp'
其他一切保持不變。
希望這對其他人有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.