2012-06-04 20 views
8

Sto usando Ubuntu 10.04 e sto provando a compilare del codice che usa gfortran. Ad un certo punto Makefiles fa:lgfortran non trovato

-L. -lgfortran 

e ottengo l'errore

/usr/bin/ld: cannot find -lgfortran 

anche se è installato:

ldconfig -p | grep fortran 
    libgfortran.so.3 (libc6,x86-64) => /usr/lib/libgfortran.so.3 

Come posso risolvere il problema?

P.S: Il Makefile:

## FLAGS 

CC:= gcc 
C++:= g++ 
CFLAGS:= -c -O -Dintel -g 
FC:= gfortran 
FFLAGS:= -c -O -cpp -g 
LD:= g++ 
LDFLAGS:= -O 


WETTER_CGAL_FLAGS:= -g 


#WETTER-Data 
WETTER_cgal: weather.cpp surface_alg.h $(WETTER_CGAL_OBJECTS) WATT_interface.h data.cpp 
    $(C++) $(WETTER_CGAL_FLAGS) -c weather.cpp -frounding-math 
    $(C++) -c data.cpp -frounding-math 
    $(LD) $(WETTER_CGAL_OBJECTS) weather.o data.o -o WETTER_cgal -L. -lgfortran -lgmp -lCGAL -frounding-math -fp-model 
+1

Potrebbe fornire un Makefile minima che produce l'errore? Deve essere necessariamente colpa sua, poiché l'ambiente della shell sembra soddisfacente. –

+0

fatto, le domande sono state aggiornate con quella informazione – flow

risposta

12

non per caso la versione gfortran differire dal versione del g++? O forse è installato in una posizione diversa?

L'-lname opzione (in questo caso è namegfortran) indica al linker di cercare un file libreria chiamata libname.a nel percorso di ricerca della libreria. Se trovato e nessun collegamento statico viene applicato dall'opzione -[B]static, il linker ricercherà ancora per libname.so e si collegherà invece ad esso (se trovato). Se non viene rilevato libname.a, verrà fornito un errore nonostante la presenza di libname.so.

Ci dovrebbe essere un libgfortran.a da qualche parte nell'installazione gfortran. Cercalo con find e fornisci il percorso per g++ con -L/path/to/compiler/libs. Se g++ è la stessa versione di gfortran, il percorso a libgfortran.a sarà già presente nel percorso di ricerca della libreria (poiché le librerie statiche C/C++ e Fortran si trovano nello stesso posto). Non sarà presente se entrambi i compilatori differiscono nella loro versione.

Ad esempio in un sistema basato a 64 bit RedHat libgfortran.a si trova /usr/lib/gcc/x86_64-redhat-linux/<GCC version>/ mentre il comune libgfortran.so.* si trovano in /usr/lib64.

Una soluzione alternativa è quella di sostituire -lgfortran con /usr/lib/libgfortran.so.3.

L'opzione -L. è piuttosto correlata a -lCGAL che a -lgfortran.

4

Ho avuto lo stesso problema oggi durante la compilazione di ATLAS ed è stato in grado di risolverlo utilizzando un collegamento simbolico da libgfortran.so.3 a libgfortran.so.

+0

Ok, questo ha funzionato per me, ma perché ha funzionato? Inoltre, sarebbe stato possibile creare semplicemente il collegamento in 'ld.so.conf.d /'? – Seanny123

3

solo assicurarsi di:

gcc --version 

E

gfortan --version 

è lo stesso.

/usr/bin/ 

Contiene le diverse versioni.

Ad esempio: se gcc--version returns 4.7.3 e gfortran --version 4.8, una semplice modifica potrebbe essere la seguente.

sudo cp /usr/bin/gcc-4.8 /usr/bin/gcc 

Dovrebbe funzionare.

+0

Nel mio sistema puntava su/etc/alternative/gcc, ho usato il comando 'alternatives --config gcc' per selezionare la versione appropriata di gcc – Jijo

2

Ho avuto lo stesso problema e ho provato il seguente comando. Il problema è stato risolto con questo:

sudo ln -s /usr/lib/x86_64-linux-gnu/libgfortran.so.3 /usr/lib/libgfortran.so

+0

E ha risolto il problema o cosa è successo quando lo hai provato? –