如何编译lapack以便在安装八度音程时可以正确使用?

use*_*994 7 installation gcc fortran octave lapack

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

在此输入图像描述

这些都是我用来建立自己的步骤BLASLAPACK.BLAS ~/src/BLAS的来源是在LAPACK ~/src/lapack-3.5.0的来源进入,而八度音阶3.8.1的来源是~/src/octave-3.8.1.只有两个模块,1) pcre/8.33 2) acml/5.3.1/gfortran64加载,我编译BLAS共享库使用

gfortran -shared -O2 *.f -o libblas.so -fPIC
Run Code Online (Sandbox Code Playgroud)

和静态库使用

gfortran -O2 -c *.f -fPIC
ar cr libblas.a *.o
Run Code Online (Sandbox Code Playgroud)

然后我将共享库复制libblas.so到〜/ src/octave-3.8.1.make.inclapack的目录中的文件内容是:

####################################################################
#  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
Run Code Online (Sandbox Code Playgroud)

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

./configure命令行是:

./configure --prefix=$HOME/bin/octave --with-blas=./libblas.so --with-lapack=$HOME/src/octave-3.8.1/liblapack.a --disable-readline --enable-64
Run Code Online (Sandbox Code Playgroud)

我可以通过./configure.然后我键入make以尝试构建八度音阶3.8.1并且我得到了上述错误.

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

Yuh*_*ong 6

刚刚在我老板的野兽上编译了lapack共享库...这是一个几乎做得对的链接.我做了一些改变:

(1)将-fPIC添加到

OPTS & NOOPT in make.inc
Run Code Online (Sandbox Code Playgroud)

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

BLASLIB = ../../libblas.so

LAPACKLIB = ../liblapack.so
Run Code Online (Sandbox Code Playgroud)

(3)在./SRC中,从中更改Makefile

../$(LAPACKLIB): $(ALLOBJ)
    $(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
    $(RANLIB) $@
Run Code Online (Sandbox Code Playgroud)

../$(LAPACKLIB): $(ALLOBJ)
    $(LOADER) $(LOADOPTS) -shared -Wl,-soname,liblapack.so -o $@ $(ALLOBJ) ../libblas.so
Run Code Online (Sandbox Code Playgroud)

Cuz lapack正在调用blas,如果你错过了最后一部分,你的liblapack.so将失败!你需要链接liblapack.so libblas.so(libatlas.so也行).您可以使用"ldd liblapack.so"来检查其依赖性.如果你在那里看到libblas.so,那么你做得很对.

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

$(BLASLIB): $(ALLOBJ)
$(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
$(RANLIB) $@
Run Code Online (Sandbox Code Playgroud)

$(BLASLIB): $(ALLOBJ)
$(LOADER) $(LOADOPTS) -z muldefs -shared -Wl,-soname,libblas.so -o $@ $(ALLOBJ)
Run Code Online (Sandbox Code Playgroud)

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

make blaslib 
Run Code Online (Sandbox Code Playgroud)

然后

make lapacklib
Run Code Online (Sandbox Code Playgroud)

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

(6)您可能需要将LD_LIBRARY_PATH设置为保存库文件的位置.google it ...如果没有由admin设置,那么

export LD_LIBRARY_PATH=path-to-lib
Run Code Online (Sandbox Code Playgroud)

如果已经设置,那么

export LD_LIBRARY_PATH=path-to-lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

覆盖默认的库.

这样你就不会有ld链接错误.祝好运!!

在lapack-3.7.0中,SRC/Makefile中有冗余行.只需删除它们即可解决您的错误.