как да компилирам lapack, така че да може да се използва правилно по време на инсталиране на octave?

Опитвам се да инсталирам най-новата octave 3.8.1 от източника в клъстер, изпълняващ redhat+IBM LSF. Нямам достъп за писане никъде другаде освен собствената си домашна директория, затова трябва да инсталирам 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, компилирах BLAS споделена библиотека, използвайки

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. Съдържанието на файла make.inc в директорията на lapack е:

####################################################################
#  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

Мога да предам ./configure. След това написах make, за да се опитам да изградя octave 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, за да направя? Не е нужно да се ограничавате до горните две точки, тъй като може да има други причини за грешката. Всеки съвет за решаване на този проблем е добре дошъл. Ако имате нужда от друга информация, моля, кажете ми. Благодаря ти.


person user2384994    schedule 05.05.2014    source източник
comment
Почистихте ли помощните компилационни файлове между опитите си да стартирате make? Относно предаването на флагове към компилацията Octave, можете да го направите директно в стъпката за конфигуриране: ./configure CXXFLAGS='-O2 -fPIC'.   -  person juliohm    schedule 05.05.2014
comment
Благодаря ти. Написах make clean преди make. Добавих CXXFLAGS='-O2 -fPIC' в аргументите на командния ред за ./configure, но се появява същата грешка.   -  person user2384994    schedule 05.05.2014
comment
@user2384994 успя ли? Може би трябва също да промените CFLAGS, LOADOPTS и NOOPT в make.inc (само предполагам). Също така можете да регистрирате компилацията на lapack и да проверите дали компилаторите наистина се извикват с -fPIC флаг.   -  person Jakob Kroeker    schedule 16.06.2014


Отговори (2)


Току-що компилирах споделената библиотека на 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) $@

to

../$(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 от

$(BLASLIB): $(ALLOBJ)
$(ARCH) $(ARCHFLAGS) $@ $(ALLOBJ)
$(RANLIB) $@

to

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

(5) Нямам нужда от libtmg.so, за да не го променям... Стартирайте

make blaslib 

Тогава

make lapacklib

Ще имате компилирани и двете. Проверявам liblapack.so с изграждане на numpy върху него и зареждане на Python ctypes.cdll. Всичко ми работи за решаване на собствени стойности и собствени вектори... Така че трябва да е наред...

(6) МОЖЕ ДА СЕ НАЛАГА ДА НАСТРОЙТЕ LD_LIBRARY_PATH до мястото, където съхранявате вашите библиотечни файлове. google it... Ако не е зададено от администратора, тогава

export LD_LIBRARY_PATH=path-to-lib

Ако вече е зададено, тогава

export LD_LIBRARY_PATH=path-to-lib:$LD_LIBRARY_PATH

за да презапишете вашите библиотеки по подразбиране.

За да нямате грешки при свързване на ld. Късмет!!

В lapack-3.7.0 има излишни редове в SRC/Makefile. Простото им изтриване ще реши грешката ви.

person Yuhong    schedule 22.10.2014
comment
Срещам Makefile:386: *** липсващ разделител. Спри се. грешка при използване на това. - person Allan Ruin; 21.05.2015
comment
@AllanRuin Проверихте ли разделите си? вторият ред от нещата на makefile трябва да е на един раздел разстояние от полето (не интервали, раздел). - person Fábio Dias; 23.03.2016
comment
вие основно изхвърлихте статичните libs, за да изградите динамични libs. - person μολὼν.λαβέ; 19.07.2016

Бих предложил да използвате 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"
person user2288551    schedule 12.09.2018