2014-05-05 20 views
5

Tôi đang cố cài đặt octave 3.8.1 mới nhất từ ​​nguồn trong một cụm đang chạy redhat + IBM LSF. Tôi không có quyền ghi vào bất cứ nơi nào khác ngoại trừ thư mục chính của riêng tôi, đó là lý do tại sao tôi phải cài đặt quãng tám từ nguồn. Các blas và lapack được cung cấp bởi cụm không hoạt động vì vậy tôi phải xây dựng chúng một mình. Bây giờ tôi đã hoàn thành biên soạn cả blas và LAPACK chuyền ./configure, nhưng khi tôi chạy làm, một lỗi được báo cáo như sau:làm thế nào để biên dịch lapack để nó có thể được sử dụng chính xác trong quá trình cài đặt quãng tám?

enter image description here

Đây là những bước tôi sử dụng để xây dựng của riêng tôi BLASLAPACK. Nguồn của BLAS là trong ~/src/BLAS trong khi nguồn của LAPACK là trong ~/src/lapack-3.5.0 và nguồn của octave 3.8.1 là trong ~/src/octave-3.8.1. Chỉ với hai mô-đun, 1) pcre/8.33 2) acml/5.3.1/gfortran64, nạp, tôi biên soạn BLAS chia sẻ thư viện sử dụng

gfortran -shared -O2 *.f -o libblas.so -fPIC 

và thư viện tĩnh nhờ sủ dụng

gfortran -O2 -c *.f -fPIC 
ar cr libblas.a *.o 

Sau đó, tôi sao chép các thư viện chia sẻ libblas.so tới ~/src/quãng tám-3.8. 1. Nội dung của make.inc tệp trong thư mục của lapack là:

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

Sau đó, tôi nhập để biên dịch LAPACK. Sau khi biên dịch, tôi sao chép đầu ra liblapack.a thành ~/src/octave-3.8.1.

Dòng ./configure lệnh là:

./configure --prefix=$HOME/bin/octave --with-blas=./libblas.so --with-lapack=$HOME/src/octave-3.8.1/liblapack.a --disable-readline --enable-64 

tôi có thể vượt qua ./configure. Sau đó, tôi gõ make để cố gắng xây dựng quãng tám 3.8.1 và tôi đã nhận được lỗi trên.

Từ tệp make.inc có thể thấy rằng tôi đã làm theo đề xuất của trình biên dịch "recompile with -fPIC" và sửa đổi make.inc cho phù hợp. Tôi cũng thêm công tắc -shared vào biến số OPTS. Ngoài ra, tôi đã thử sử dụng phiên bản LAPACK cũ nhưng không hoạt động. Tôi thực sự không biết tại sao lỗi vẫn xuất hiện. Vì vậy, tôi tự hỏi nếu bạn có thể xin vui lòng cho tôi biết làm thế nào để biên dịch các thư viện LAPACK để nó có thể được sử dụng một cách chính xác trong quá trình cài đặt octave 3.8.1. Hai điểm sau đây có thể đáng xem xét. (1) tôi nên biên dịch lapack như một thư viện tĩnh hoặc một thư viện được chia sẻ? (2) nên -fPIC chuyển đổi được áp dụng để biên soạn lapack hoặc octave của make? Nếu sau này, làm thế nào để áp dụng -fPIC để thực hiện? Bạn không phải bị giới hạn ở hai điểm trên vì có thể có các lý do khác cho lỗi này. Bất kỳ lời khuyên nào để giải quyết vấn đề này đều được hoan nghênh. Nếu bạn cần bất kỳ thông tin nào khác, vui lòng cho tôi biết. Cảm ơn bạn.

+0

Bạn đã dọn dẹp các tệp xây dựng phụ trợ ở giữa các lần thử chạy 'make'? Về việc truyền cờ đến bản dựng Octave, bạn có thể thực hiện trực tiếp trong bước cấu hình: './configure CXXFLAGS = '- O2 -fPIC''. – juliohm

+0

Cảm ơn bạn. Tôi gõ "làm sạch" trước khi thực hiện. Tôi đã thêm "CXXFLAGS = '- O2 -fPIC'" vào các đối số dòng lệnh cho ./configure, nhưng cùng một lỗi xảy ra. – user2384994

+0

@ user2384994 bạn đã thành công chưa? Có lẽ bạn cũng nên sửa đổi CFLAGS, LOADOPTS và NOOPT trong 'make.inc' (chỉ đoán). Ngoài ra bạn có thể đăng nhập xây dựng lapack và kiểm tra xem trình biên dịch có thực sự được gọi với cờ -fPIC hay không. –

Trả lời

4

Chỉ cần biên soạn lib chia sẻ trên đùi của con thú của ông chủ của tôi ... Đây là a link mà gần như đã làm đúng. tôi đã thực hiện một số thay đổi:

(1) Thêm -fPIC để

OPTS & NOOPT in make.inc 

(2) Thay đổi tên trong make.inc để .so

BLASLIB = ../../libblas.so 

LAPACKLIB = ../liblapack.so 

(3) Trong./ SRC, thay đổi Makefile từ

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

để

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

Cuz LAPACK đang kêu gọi blas, nếu bạn bỏ lỡ phần cuối cùng, liblapack.so của bạn sẽ thất bại! Bạn cần phải LINK libapap.so chống lại libblas.so (libatlas.so cũng OK). Bạn có thể sử dụng "ldd liblapack.so" để kiểm tra sự phụ thuộc của nó. Nếu bạn thấy libblas.so trong đó, khá nhiều bạn đã làm đúng.

(4) Trong ./BLAS/SRC, thay đổi Makefile từ

$(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) Tôi không cần libtmg.so vì vậy mà tôi đã không thay đổi nó ... Run

make blaslib 

Sau đó

make lapacklib 

Bạn sẽ có cả hai được biên dịch. Tôi kiểm tra liblapack.so với xây dựng một numpy vào nó và Python ctypes.cdll tải. Tất cả công việc cho tôi để giải quyết các giá trị riêng và số liệu riêng ... Vì vậy, nó sẽ ổn thôi ...

(6) BẠN CÓ THỂ CẦN THIẾT LẬP LD_LIBRARY_PATH nơi bạn giữ các tệp thư viện của mình. google nó ... Nếu không được thiết lập bởi admin, sau đó

export LD_LIBRARY_PATH=path-to-lib 

Nếu đã thiết lập, sau đó

export LD_LIBRARY_PATH=path-to-lib:$LD_LIBRARY_PATH 

ghi đè lên libs mặc định của bạn.

Để bạn không gặp phải lỗi liên kết ld. Chúc may mắn!!

Trong lapack-3.7.0, có các dòng thừa trong SRC/Makefile. Chỉ cần xóa chúng sẽ giải quyết được lỗi của bạn.

+0

Tôi gặp một dấu phân tách Makefile: 386: ***. Dừng lại. lỗi bằng cách sử dụng này. –

+1

@AllanRuin Bạn đã kiểm tra các tab của mình chưa? dòng thứ hai của công cụ makefile cần phải là một tab cách lề (không phải khoảng trống, tab) .. –

+0

về cơ bản bạn đã loại bỏ các lib tĩnh để xây dựng các thư viện động. –

Các vấn đề liên quan