как скомпилировать lapack, чтобы его можно было корректно использовать при установке октавы?

Я пытаюсь установить последнюю октаву 3.8.1 из исходного кода в кластере с Redhat+IBM LSF. У меня нет доступа для записи куда-либо еще, кроме моего собственного домашнего каталога, поэтому я должен установить октаву из исходного кода. 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, чтобы попытаться собрать октаву 3.8.1, и получаю указанную выше ошибку.

Из файла make.inc видно, что я последовал совету компилятора "recompile with -fPIC" и соответствующим образом изменил make.inc. Я также добавляю переключатель -shared в переменную OPTS. Кроме того, я пытался использовать старую версию LAPACK, но не работал. Я действительно понятия не имею, почему ошибка все еще выходит. Поэтому мне интересно, не могли бы вы рассказать мне, как скомпилировать библиотеку LAPACK, чтобы ее можно было правильно использовать при установке октавы 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 потерпит неудачу! Вам необходимо СВЯЗАТЬ libblapack.so с libblas.so ( libbatlas.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, где вы храните файлы своей библиотеки. погуглите... Если не задано админом, то

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
вы в основном выбросили статические библиотеки для создания динамических библиотек. - 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