从source:链接到共享库失败
build R from source: links to shared libraries failed
一个多星期来,我一直摸不着头脑,我的问题没有答案。我想用Intel MKL1作为共享库从cran源代码构建R。下面是我用来测试配置的小脚本:
#! /bin/sh
export MKL=/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl
MKL=" -L${_mkllibpath}
-Wl,--start-group
-lmkl_gf_lp64
-lmkl_gnu_thread
-lmkl_core
-Wl,--end-group
-lgomp -lpthread"
./configure --prefix=/usr
--libdir=/usr/lib
--datarootdir=/usr/share
rsharedir=/usr/share/R/
rincludedir=/usr/include/R/
rdocdir=/usr/share/doc/R/
--with-blas="${MKL}"
--with-lapack
--enable-R-shlib
make -j4
这个小脚本做了如下的事情:
- 在x86_64上使用gcc和gfortran构建R
- 使用gnu线程构建R
- 导出路径到Intel MKL库
- 动态链接BLAS到intel MKL
现在我开始生气了。在一个系统上,Archlinux,构建将允许我在构建目录
中运行ldd的以下输出$ ldd bin/exec/R
.....
libmkl_gf_lp64.so => /opt/intel/mkl/lib/intel64/libmkl_gf_lp64.so (0x00007f7707797000)
libmkl_core.so => /opt/intel/mkl/lib/intel64/libmkl_core.so (0x00007f7705c2a000)
libmkl_gnu_thread.so => /opt/intel/mkl/lib/intel64/libmkl_gnu_thread.so (0x00007f7704ed3000)
libimf.so => /opt/intel/lib/libimf.so (0x00007f7704814000)
libintlc.so.5 => /opt/intel/lib/libintlc.so.5 (0x00007f770284b000)
.......
这正是我要找的。现在,相同的脚本与Intel MKL安装在相同的路径,运行在Fedora22。
$ ldd bin/exec/R
linux-vdso.so.1 (0x00007ffe9a9c5000)
libR.so => /usr/lib64/R/lib/libR.so (0x00007f45d9b69000)
libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f45d9947000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f45d972a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f45d936a000)
libblas.so.3 => /lib64/libblas.so.3 (0x00007f45d9111000)
libgfortran.so.3 => /lib64/libgfortran.so.3 (0x00007f45d8de5000)
......
如所见,没有链接到英特尔MKL。
我玩过各种make选项,ld_path,链接器选项等;我检查了环境变量;我已经检查了ldconfig缓存;等。仍然无法获得Fedora的正确链接。
我将感谢任何提示,在哪里寻找我的问题的根源。
经过多次尝试,下面是使用Intel MKL和ICC构建R-cran的正确脚本:
#! /bin/sh
source /opt/intel/compilers_and_libraries_2016.0.109/linux/bin/mklvars intel64
source /opt/intel/bin/compilervars.sh intel64
_icclibpath=/opt/intel/compilers_and_libraries_2016.0.109/linux/compiler/intel64/
_mkllibpath=${MKLROOT}/lib/intel64/
MKL=" -L${_mkllibpath} -lmkl_rt -lpthread"
export CC="icc"
export CXX="icpc"
export AR="xiar"
export LD="xild"
export F77="ifort"
export CFLAGS="-g -O3 -xHost -I${MKLROOT}/include"
export CXXFLAGS="-g -O3 -xHost -I${MKLROOT}/include"
export FFLAGS="-I${MKLROOT}/include"
export FCFLAGS="-I${MKLROOT}/include"
# shared libs
./configure --with-blas="${MKL}" --enable-R-shlib --enable-BLAS-shlib
# static libs
#./configure --with-blas="${MKL}" --with-lapack
make -j4
注意:
- 脚本是为Parallel studio 2016编写的。改变路径
- libRlib和libRblas可以构建为共享库或静态库。
- 可以添加更多的选项来配置 最好的方法是将mkvars和compilervars放在一个脚本中,这样就不会出现这种情况一旦构建完成就会污染shell环境。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- SFINAE 序列化共享指针失败
- Android OpenCV Linked CXX 共享库失败
- dynamic_cast over共享库在使用clang编译的Android上的Qt中失败
- 在静态库中链接失败,但链接共享库成功
- ReadFile winapi在从虚拟盒共享文件夹读取时失败.GetLastError正在引发错误183
- 循环迭代后共享指针断言失败
- 如果静态和动态加载了libcrypto,则两次加载的动态/共享库/RSA_check_key将失败
- 当 0 或 NULL 通过模板间接传递给共享指针(shared_ptr OR unique_ptr)时,调用函数失败
- Makefile与共享库链接失败
- 从source:链接到共享库失败
- Perl捕获嵌入脚本的stdout,如果在dlopen中加载共享库,则失败
- g++尝试(失败)静态链接到libstdc++共享对象
- CUDA 运行时错误:未指定的启动失败 & 超出范围的共享或本地地址
- 程序失败.共享 Ptr 矢量 c++