2013-09-16 45 views
5

Tôi có một chương trình tinh vi để lắp các hàm phi tuyến với phương pháp của Levenberg-Marquardt.Lỗi liên kết Lapack, biên dịch lại với -fPIC

Chương trình sử dụng một người giải quyết cho một hệ phương trình tuyến tính từ thư viện LAPACK, nơi tôi đã sử dụng:

extern "C" ... 

Để liên kết đến các thư viện fortran bên ngoài. Chương trình làm việc trên máy tính xách tay của tôi mà không gặp vấn đề gì (sử dụng Ubuntu 12.04), và tôi đã sử dụng nó để thử nghiệm một lúc.

Vấn đề:

Bây giờ tôi chuyển sang chất béo lớn máy tính 64-core để bắt đầu thực hiện một số tính toán thực tế, máy tính có một linux khoa học 6 trên đó. Hóa ra là các máy tính lớn không có LAPACK cài đặt, vì vậy tôi đã LAPACK 3.4.2, biên soạn nó, và theo các hướng dẫn từ đây để xây dựng nó:

http://matrixprogramming.com/2011/04/using-lapack-from-c/comment-page-1

Sau đó, tôi đã thay đổi hoàn toàn không có gì trong tập tin cmake của tôi mà làm việc trước đây, và chỉ cần thêm các tùy chọn kết nối:

-L/xdata/Compilers/Sources/lapack-3.4.2 

Bây giờ tôi nhận được lỗi:

/usr/bin/ld: /xdata/Compilers/Sources/lapack-3.4.2/liblapack.a(dsytrf.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC 

Và chỉ dành riêng cho thành tích đó, kịch bản cmake của tôi là có -fPIC và -fPIE ở khắp mọi nơi ... Các liên kết Tôi sử dụng nó:

target_link_libraries(LibsModule -lgsl) 
target_link_libraries(LibsModule -lgslcblas) 
target_link_libraries(LibsModule -lrt) 
target_link_libraries(LibsModule -lpthread) 
target_link_libraries(LibsModule -pie) 
target_link_libraries(LibsModule -fPIC) 
target_link_libraries(LibsModule -L/xdata/Compilers/Sources/lapack-3.4.2) 
target_link_libraries(LibsModule -lgfortran) 
target_link_libraries(LibsModule -llapack -fPIC) 
target_link_libraries(LibsModule -lblas -fPIC) 

Tôi đã làm gì sai? Xin cho biết.

Cảm ơn bạn.

Trả lời

5

Giải pháp là biên dịch lại chính lapack với -fPIC. Vì vậy, trong sự thay đổi make.inc của bạn như sau:

FORTRAN = gfortran -m64 -fPIC 
OPTS  = -O2 -m64 -fPIC 
DRVOPTS = $(OPTS) 
NOOPT = -O0 -m64 -fPIC 
LOADER = gfortran -m64 -fPIC 

Và bạn cũng có thể sử dụng -O3 để tối ưu hóa tốt hơn, nó hoạt động tốt!

Tùy chọn -m64 tùy thuộc vào việc bạn có muốn sử dụng hệ thống 64 bit hay không. Lựa chọn của bạn!

Chúc mừng!

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