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

Gcc 如何编译lapack,以便在安装octave时正确使用它?,gcc,installation,fortran,octave,lapack,Gcc,Installation,Fortran,Octave,Lapack,我正在尝试在运行redhat+IBMLSF的集群中从源代码安装最新的octave 3.8.1。除了我自己的home dir之外,我没有其他任何地方的写权限,这就是为什么我必须从源代码安装octave。集群提供的blas和lapack不起作用,因此我必须自己构建它们。我现在已经完成了blas和lapack的编译,并通过了/configure,但是当我运行make时,会报告如下错误: 这些是我用来构建自己的BLAS和LAPACK的步骤。BLAS的源在~/src/BLAS中,而LAPACK的源在~/

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

这些是我用来构建自己的
BLAS
LAPACK
的步骤。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
,我使用

gfortran -shared -O2 *.f -o libblas.so -fPIC
gfortran -O2 -c *.f -fPIC
ar cr libblas.a *.o
和静态库的使用

gfortran -shared -O2 *.f -o libblas.so -fPIC
gfortran -O2 -c *.f -fPIC
ar cr libblas.a *.o
然后我将共享库
libblas.so
复制到~/src/octave-3.8.1。lapack目录中的
make.inc
文件内容如下:

####################################################################
#  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
命令行是:

./configure --prefix=$HOME/bin/octave --with-blas=./libblas.so --with-lapack=$HOME/src/octave-3.8.1/liblapack.a --disable-readline --enable-64
我可以通过考试。然后我键入
make
尝试构建octave 3.8.1,得到了上面的错误


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

刚刚在我老板的beast上编译了lapack共享库。。。这是几乎做对了的。 我做了一些改变:

(1) 将-fPIC添加到

OPTS & NOOPT in make.inc
(2) 将make.inc中的名称更改为.so

BLASLIB = ../../libblas.so

LAPACKLIB = ../liblapack.so
(3) 在./SRC中,将Makefile从

../$(LAPACKLIB): $(ALLOBJ)
    $(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
    $(RANLIB) $@
$(BLASLIB): $(ALLOBJ)
$(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
$(RANLIB) $@

因为lapack正在呼叫blas,如果你错过了最后一部分,你的Librapack.so将失败!您需要将liblapack.so链接到libblas.so(libatlas.so也可以)。您可以使用“ldd liblapack.so”检查其依赖性。如果你看到libblas,在那里,你做得很对

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

../$(LAPACKLIB): $(ALLOBJ)
    $(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
    $(RANLIB) $@
$(BLASLIB): $(ALLOBJ)
$(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
$(RANLIB) $@

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

然后

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

(6) 您可能需要设置保存库文件的LD_LIBRARY_路径。 谷歌它。。。如果不是由管理员设置,则

export LD_LIBRARY_PATH=path-to-lib
如果已设置,则

export LD_LIBRARY_PATH=path-to-lib:$LD_LIBRARY_PATH
覆盖您的默认库

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


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

我建议使用OpenBLAS

> git clone https://github.com/xianyi/OpenBLAS.git
> make
> make make --PREFIX=INSTALL_DIR install
将库从OpenBLAS移动到/usr/lib64

> cp /path/to/OpenBLAS/lib/* /usr/lib64/
然后转到倍频程安装路径并运行

> "your specific flags" ./configure "your specific arguments" --with-blas="-lopenblas"

在尝试运行
make
之间,您是否清理了辅助生成文件?关于向倍频程构建传递标志,您可以直接在配置步骤中执行:
/configure cxflags='-O2-fPIC'
。谢谢。我在制作前输入了“制作干净”。我在./configure的命令行参数中添加了“cxflags='-O2-fPIC',但出现了相同的错误。@user2384994成功了吗?也许您还应该在
make.inc
中修改CFLAGS、LOADOPTS和NOOPT(只是猜测)。您还可以记录lapack构建并检查编译器是否真的使用-fPIC标志调用。停止使用此选项时出错。@AllanRuin是否检查了选项卡?makefile的第二行内容需要与margin(而不是spaces,tab)保持一个选项卡的距离……基本上,您抛弃了静态lib来构建动态lib。