2014-05-05 6 views
5

मैं Redhat + IBM LSF चलाने वाले क्लस्टर में स्रोत से नवीनतम ऑक्टेट 3.8.1 स्थापित करने का प्रयास कर रहा हूं। मेरे पास अपने घर के डीआईआर को छोड़कर कहीं और लिखने की पहुंच नहीं है, इसलिए मुझे स्रोत से ऑक्टेटव इंस्टॉल करना है। क्लस्टर द्वारा प्रदान किए गए ब्लैस और लैपैक काम नहीं करते हैं इसलिए मुझे उन्हें स्वयं बनाना है। मैं अब दोनों ब्लास और LAPACK संकलन समाप्त कर दिया है और ./configure पारित कर दिया, लेकिन जब मैं बनाने के चलाने के लिए, एक त्रुटि के रूप में इस रिपोर्ट की जाती है:लैपैक को संकलित कैसे करें ताकि इसे ऑक्टेट की स्थापना के दौरान सही ढंग से उपयोग किया जा सके?

enter image description here

ये कदम मैं अपने खुद के BLAS और LAPACK बनाने के लिए उपयोग कर रहे हैं। बीएलएएस का स्रोत ~/src/BLAS में है जबकि एलएपीएक्स का स्रोत ~/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 

तो मैं ~/src/सप्तक-3.8 करने के लिए शेयर की गई लाइब्रेरी libblas.so कॉपी संकलित। 1। LAPACK के dir में 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 

तब मैं 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 

मैं कॉन्फ़िगर पारित कर सकते हैं। फिर मैं ऑक्टेट 3.8.1 बनाने की कोशिश करने के लिए make टाइप करता हूं और मुझे उपरोक्त त्रुटि मिली है।

make.inc फ़ाइल से यह देखा जा सकता है कि मैंने कंपाइलर "recompile with -fPIC" के सुझाव का पालन किया है और तदनुसार make.inc को संशोधित किया है। मैं OPTS चर में -shared स्विच भी जोड़ता हूं। इसके अलावा, मैंने पुराने LAPACK संस्करण का उपयोग करने की कोशिश की है लेकिन काम नहीं कर रहा है। मुझे वास्तव में कोई जानकारी नहीं है कि त्रुटि अभी भी क्यों आती है। तो मुझे आश्चर्य है कि क्या आप कृपया मुझे बता सकते हैं कि LAPACK लाइब्रेरी को संकलित कैसे करें ताकि इसे ऑक्टेट 3.8.1 की स्थापना के दौरान सही ढंग से उपयोग किया जा सके। निम्नलिखित दो बिंदुओं पर विचार करने लायक हो सकता है। (1) क्या मुझे लैपैक को स्थिर पुस्तकालय या साझा लाइब्रेरी के रूप में संकलित करना चाहिए? (2) -fPIC स्विच लैपैक संकलन या ऑक्टेट के make पर लागू किया जाना चाहिए? यदि उत्तरार्द्ध, कैसे लागू करने के लिए - एफपीआईसी बनाने के लिए? आपको उपरोक्त दो बिंदुओं तक सीमित नहीं होना चाहिए क्योंकि त्रुटि के अन्य कारण हो सकते हैं। इस समस्या को हल करने के लिए कोई सलाह स्वागत है। अगर आपको किसी अन्य जानकारी की ज़रूरत है तो कृपया मुझे बताएं। धन्यवाद।

+0

क्या आपने 'मेक' चलाने के अपने प्रयासों के बीच सहायक बिल्ड फाइलों को साफ़ किया है? ऑक्टेव बिल्ड में फ़्लैग पास करने के संबंध में, आप इसे सीधे कॉन्फ़िगर चरण में कर सकते हैं: './configure CXXFLAGS = '- O2 -fPIC''। – juliohm

+0

धन्यवाद। मैंने बनाने से पहले "साफ करें" टाइप किया। मैंने ./configure के लिए कमांड लाइन तर्कों में "CXXFLAGS = '- O2 -fPIC' जोड़ा, लेकिन एक ही त्रुटि होती है। – user2384994

+0

@ user2384994 क्या आप सफल हुए? शायद आपको 'make.inc' (बस अनुमान लगाने) में CFLAGS, LOADOPTS और NOOPT को संशोधित करना चाहिए। इसके अलावा आप लैपैक बिल्ड लॉग कर सकते हैं और जांच सकते हैं कि कंपाइलर्स को वास्तव में -एफपीआईसी ध्वज के साथ बुलाया जाता है या नहीं। –

उत्तर

4

बस मेरे मालिक की जानवर पर LAPACK साझा lib संकलित ... यहाँ a link जो लगभग यह सही किया है।

(1) जोड़ना -fPIC

को
OPTS & NOOPT in make.inc 

(2) make.inc में नाम बदलें .तो को

BLASLIB = ../../libblas.so 

LAPACKLIB = ../liblapack.so 

(3) में: मैं कुछ परिवर्तन किए।/ एसआरसी,

../$(LAPACKLIB): $(ALLOBJ) 
    $(LOADER) $(LOADOPTS) -shared -Wl,-soname,liblapack.so -o [email protected] $(ALLOBJ) ../libblas.so 

Cuz LAPACK ब्लास बुला रहा है, अगर आप बहुत आखिरी हिस्सा याद आती है, अपने liblapack.so असफल हो जायेगी करने

../$(LAPACKLIB): $(ALLOBJ) 
    $(ARCH) $(ARCHFLAGS) [email protected] $(ALLOBJ) 
    $(RANLIB) [email protected] 

से Makefile बदल! Liblas.so के खिलाफ आपको liblapack.so को लिंक करने की आवश्यकता है (libatlas.so भी ठीक है)। आप इसकी निर्भरता की जांच के लिए "ldd liblapack.so" का उपयोग कर सकते हैं। यदि आप वहां libblas.so देखते हैं, तो आपने इसे बहुत सही किया है।

(4) ./BLAS/SRC में, Makefile से बदल

$(BLASLIB): $(ALLOBJ) 
$(ARCH) $(ARCHFLAGS) [email protected] $(ALLOBJ) 
$(RANLIB) [email protected] 

को
$(BLASLIB): $(ALLOBJ) 
$(LOADER) $(LOADOPTS) -z muldefs -shared -Wl,-soname,libblas.so -o [email protected] $(ALLOBJ) 

(5) मैं libtmg.so की जरूरत नहीं है, इसलिए है कि मैंने नहीं किया इसे बदलने के लिए ... भागो

make blaslib 

फिर

make lapacklib 

आप दोनों को संकलित किया जाएगा। मैं liblapack.so पर एक numpy निर्माण और पायथन ctypes.cdll लोडिंग के साथ जांचें। मेरे लिए सभी काम eigenvalues ​​और eigenvectors को हल करने के लिए ... तो यह ठीक होना चाहिए ...

(6) आपको अपनी लाइब्रेरी फ़ाइलों को रखने के लिए LD_LIBRARY_PATH सेट अप करने की आवश्यकता हो सकती है। यह गूगल ...,,

export LD_LIBRARY_PATH=path-to-lib:$LD_LIBRARY_PATH 

व्यवस्थापक द्वारा सेट नहीं है तो

export LD_LIBRARY_PATH=path-to-lib 

तो पहले से ही सेट फिर अपने डिफ़ॉल्ट libs अधिलेखित करने के लिए।

ताकि आपके पास एलडी लिंकिंग त्रुटियां नहीं होंगी। सौभाग्य!!

लैपैक-3.7.0 में, एसआरसी/मेकफ़ाइल में अनावश्यक रेखाएं हैं। बस उन्हें हटाने से आपकी त्रुटि हल हो जाएगी।

+0

मैं मेकफ़ाइल से मिलता हूं: 386: *** लापता विभाजक। रूक जा। इसका उपयोग कर त्रुटि। –

+1

@AllanRuin क्या आपने अपने टैब की जांच की? मेकफ़ाइल सामान की दूसरी पंक्ति मार्जिन से एक टैब दूर होने की आवश्यकता है (रिक्त स्थान, टैब नहीं) .. –

+0

आपने मूल रूप से गतिशील libs बनाने के लिए स्थिर libs बाहर फेंक दिया। –

संबंधित मुद्दे

 संबंधित मुद्दे