2013-09-16 15 views
5

Ho un programma sofisticato per il montaggio di funzioni non lineari con il metodo di Levenberg-Marquardt.Errore di collegamento di Lapack, ricompilare con -fPIC

il programma utilizza un risolutore per un sistema di equazioni lineari dalla biblioteca LAPACK, dove ho usato:

extern "C" ... 

Per creare un collegamento a librerie FORTRAN esterne. Il programma ha funzionato senza problemi sul mio laptop (che utilizza Ubuntu 12.04), e lo sto usando da un po 'per i test.

Il problema:

Ora mi sono trasferito al grande grasso computer a 64-core, al fine di iniziare a fare alcuni calcoli reali, il computer dispone di una Scientific Linux 6 su di esso. Si è scoperto che il grande computer non dispone LAPACK installato, così ho preso LAPACK 3.4.2, compilato, e seguite le istruzioni qui per costruirlo:

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

Dopo di che, ho cambiato assolutamente nulla nel mio file cMake che ha lavorato prima, e appena aggiunto l'opzione di collegamento:

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

Ora ottengo l'errore:

/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 

E solo per la cronaca, il mio script è CMake ha -fPIC e -fPIE ovunque ... Il collegamento lo uso:

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) 

cosa ho fatto di sbagliato? Si prega di avvisare.

Grazie.

risposta

5

La soluzione era ricompilare lapack stessa con -fPIC. Quindi nel tuo make.inc modificare nella seguente:

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

E si può anche utilizzare -O3 per una migliore ottimizzazione, funziona benissimo!

L'opzione -m64 dipende se si desidera utilizzare un sistema a 64 bit. La tua scelta!

Cheers!