首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编译lapack,以便在安装octave时可以正确使用?

如何编译lapack,以便在安装octave时可以正确使用?
EN

Stack Overflow用户
提问于 2014-05-05 08:37:02
回答 2查看 16.5K关注 0票数 7

我正在尝试在运行redhat+IBM LSF的集群中从源代码安装最新的octave 3.8.1。除了我自己的home目录,我没有对其他任何地方的写访问权限,这就是为什么我必须从源代码安装octave。集群提供的blas和lapack不起作用,所以我必须自己构建它们。我现在已经完成了blas和lapack的编译,并通过了./configure,但是当我运行make时,报告的错误如下:

这些是我用来构建我自己的BLASLAPACK的步骤。BLAS源在~/src/BLAS中,LAPACK源在~/src/lapack-3.5.0中,octave 3.8.1源在~/src/octave-3.8.1中。只加载了两个模块1) pcre/8.33 2) acml/5.3.1/gfortran64后,我使用以下命令编译了BLAS共享库

代码语言:javascript
复制
gfortran -shared -O2 *.f -o libblas.so -fPIC

和静态库使用

代码语言:javascript
复制
gfortran -O2 -c *.f -fPIC
ar cr libblas.a *.o

然后,我将共享库libblas.so复制到~/src/octave-3.8.1。lapack目录下的make.inc文件内容如下:

代码语言:javascript
复制
####################################################################
#  LAPACK make include file.                                       #
#  LAPACK, Version 3.5.0                                           #
#  November 2013                                                   #
####################################################################
#
SHELL = /bin/sh
#  
#  Modify the FORTRAN and OPTS definitions to refer to the
#  compiler and desired compiler options for your machine.  NOOPT
#  refers to the compiler options desired when NO OPTIMIZATION is
#  selected.  Define LOADER and LOADOPTS to refer to the loader and 
#  desired load options for your machine.
#
FORTRAN  = gfortran 
OPTS     = -shared -O2 -fPIC
DRVOPTS  = $(OPTS)
NOOPT    = -O0 -frecursive
LOADER   = gfortran
LOADOPTS =
#
# Timer for the SECOND and DSECND routines
#
# Default : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME
#TIMER    = EXT_ETIME
# For RS6K : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME_
# TIMER    = EXT_ETIME_
# For gfortran compiler: SECOND and DSECND will use a call to the INTERNAL FUNCTION ETIME
TIMER    = INT_ETIME
# If your Fortran compiler does not provide etime (like Nag Fortran Compiler, etc...)
# SECOND and DSECND will use a call to the INTERNAL FUNCTION CPU_TIME
# TIMER    = INT_CPU_TIME
# If neither of this works...you can use the NONE value... In that case, SECOND and DSECND will always return 0
# TIMER     = NONE
#
#  Configuration LAPACKE: Native C interface to LAPACK
#  To generate LAPACKE library: type 'make lapackelib'
#  Configuration file: turned off (default)
#  Complex types: C99 (default)
#  Name pattern: mixed case (default)
#  (64-bit) Data model: LP64 (default)
#
# CC is the C compiler, normally invoked with options CFLAGS.
#
CC = gcc
CFLAGS = -O3
#
#  The archiver and the flag(s) to use when building archive (library)
#  If you system has no ranlib, set RANLIB = echo.
#
ARCH     = ar
ARCHFLAGS= cr
RANLIB   = ranlib
#
#  Location of the extended-precision BLAS (XBLAS) Fortran library
#  used for building and testing extended-precision routines.  The
#  relevant routines will be compiled and XBLAS will be linked only if
#  USEXBLAS is defined.
#
# USEXBLAS    = Yes
XBLASLIB     =
# XBLASLIB    = -lxblas
#
#  The location of the libraries to which you will link.  (The 
#  machine-specific, optimized BLAS library should be used whenever
#  possible.)
#
#BLASLIB      = ../../librefblas.a
BLASLIB      = ~/src/BLAS/libblas.a
LAPACKLIB    = liblapack.a
TMGLIB       = libtmglib.a
LAPACKELIB   = liblapacke.a

然后输入make编译LAPACK。编译后,我将输出liblapack.a复制到~/src/octave-3.8.1。

./configure命令行为:

代码语言:javascript
复制
./configure --prefix=$HOME/bin/octave --with-blas=./libblas.so --with-lapack=$HOME/src/octave-3.8.1/liblapack.a --disable-readline --enable-64

我可以传递./configure。然后我输入make来尝试构建octave 3.8.1,我得到了上面的错误。

make.inc文件可以看出,我遵循了编译器"recompile with -fPIC“的建议,并相应地修改了make.inc。我还在OPTS变量中添加了-shared开关。此外,我已经尝试使用旧的LAPACK版本,但不起作用。我真的不知道为什么这个错误还会出现。所以我想知道您是否可以告诉我如何编译LAPACK库,以便在安装octave 3.8.1时可以正确使用它。以下两点可能值得考虑。(1)我应该将lapack编译为静态库还是共享库?(2)应该将-fPIC开关应用于lapack编译或octave的make吗?如果是后者,如何应用-fPIC来制作?你不必局限于以上两点,因为错误可能还有其他原因。欢迎任何解决这个问题的建议。如果您需要任何其他信息,请告诉我。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-10-22 13:40:17

刚刚编译了我老板的野兽的lapack共享库...这是a link,它几乎做到了这一点。我做了一些修改:

(1)添加-fPIC到

代码语言:javascript
复制
OPTS & NOOPT in make.inc

(2)将make.inc中的名称更改为.so

代码语言:javascript
复制
BLASLIB = ../../libblas.so

LAPACKLIB = ../liblapack.so

(3)在./SRC中,将Makefile从

代码语言:javascript
复制
../$(LAPACKLIB): $(ALLOBJ)
    $(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
    $(RANLIB) $@

代码语言:javascript
复制
../$(LAPACKLIB): $(ALLOBJ)
    $(LOADER) $(LOADOPTS) -shared -Wl,-soname,liblapack.so -o $@ $(ALLOBJ) ../libblas.so

因为lapack正在调用blas,如果你错过了最后一部分,你的liblapack.so将会失败!您需要将liblapack.so链接到libblas.so ( libatlas.so也可以)。您可以使用"ldd liblapack.so“检查它的依赖关系。如果你看到libblas.so在里面,你基本上做得很对。

(4)在./BLAS/SRC中,将Makefile从

代码语言:javascript
复制
$(BLASLIB): $(ALLOBJ)
$(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
$(RANLIB) $@

代码语言:javascript
复制
$(BLASLIB): $(ALLOBJ)
$(LOADER) $(LOADOPTS) -z muldefs -shared -Wl,-soname,libblas.so -o $@ $(ALLOBJ)

(5)我不需要libtmg.so,所以我没有改变它...跑

代码语言:javascript
复制
make blaslib 

然后

代码语言:javascript
复制
make lapacklib

您将对它们进行编译。我通过在其上构建一个numpy并加载Python ctypes.cdll来检查liblapack.so。对我来说,所有的工作都是为了解决特征值和特征向量。所以应该没问题...

(6)您可能需要将LD_LIBRARY_PATH设置为存储库文件的位置。谷歌一下..。如果未由管理员设置,则

代码语言:javascript
复制
export LD_LIBRARY_PATH=path-to-lib

如果已设置,则

代码语言:javascript
复制
export LD_LIBRARY_PATH=path-to-lib:$LD_LIBRARY_PATH

覆盖您的默认库。

这样就不会出现ld链接错误。祝你好运!

在lapack-3.7.0中,SRC/Makefile中有多余的行。只需删除它们就可以解决您的错误。

票数 6
EN

Stack Overflow用户

发布于 2018-09-13 03:30:57

我建议使用OpenBLAS。

代码语言:javascript
复制
> git clone https://github.com/xianyi/OpenBLAS.git
> make
> make make --PREFIX=INSTALL_DIR install

将库从OpenBLAS移动到/usr/lib64

代码语言:javascript
复制
> cp /path/to/OpenBLAS/lib/* /usr/lib64/

然后转到octave安装路径并运行

代码语言:javascript
复制
> "your specific flags" ./configure "your specific arguments" --with-blas="-lopenblas"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23463240

复制
相关文章

相似问题

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