2012-05-08 16 views
11

Questa è la prima volta che cerco di compilare il codice FORTRAN utilizzando un makefile. Il sistema operativo è Ubuntu 12.04 LTS a 64 bit. Ho incontrato i seguenti errori:"/ usr/bin/ld: impossibile trovare la libreria"

gfortran -o przm3123.exe canopy.o chem.o cnfuns.o cropdate.o datemod.o debug.o debug_cn.o f2kcli.o floatcmp.o furrow.o general.o i_errchk.o infnan.o inivar.o ioluns.o iosubs.o lambertw.o m_readvars.o utils.o wind.o fcscnc.o przm3.o rsexec.o rsinp1.o rsinp2.o rsinp3.o rsmcar.o rsmisc.o rsprz1.o rsprz2.o rsprz3.o rsprzn.o rsutil.o rsvado.o -L ../libanne4.0/lib -lwdm -ladwdm -lutil 
/usr/bin/ld: cannot find -lwdm 
/usr/bin/ld: cannot find -ladwdm 
collect2: ld returned 1 exit status 
make: *** [przm3123.exe] Error 1 

L'elemento chiave nel makefile è:

przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil 

C'è qualcosa che posso fare per correggere questo errore? Dovrei provare altri compilatori?

+3

La prima cosa da controllare è se effettivamente si hanno 'libwdm.so' e' libadwdm.so'. Suppongo che dovrebbero essere in questa directory 'libanne4.0/lib'. – birryree

+0

Sì, 'libwdm.a' e' libadwdm.a' ci sono. –

+0

Oh, librerie statiche. Puoi provare questo nel tuo makefile? 'przm2_LIBS = -L ../ libanne4.0/lib -Wl, -Bdynamic -lutil -Wl, -Bstatic -lwdm -ladwdm' - Suppongo che' util' sia 'libutil.so' (una libreria condivisa) poiché non ha Mi lamento di questo. – birryree

risposta

10

Come ../libanne4.0/lib è un percorso relativo, si potrebbe provare a cambiarlo in uno assoluto.

Inoltre, è possibile verificare se il processo del linker ha i diritti di accesso e leggere le librerie.


Update: Per avere il linker trovare una libreria specificato utilizzando l'opzione -l<name> il nome del libray deve essere lib<name>.[a|so] e il parametro di -L dovrebbe puntare il percorso fosse la biblioteca si trova.

-L deve precedere la sua opzione -l.

Si potrebbe specificare -l e/o -L più volte.

+1

Fornito il percorso assoluto, ma lo stesso errore. Ho provato 'ld adwdmlib.a' e ho ricevuto i seguenti errori:' ld: warning: impossibile trovare il simbolo della voce _start; non impostare l'indirizzo di partenza' grazie –

+1

Che cos'è 'adwdmlib.a'? – alk

+1

adwdmlib.a è una libreria che devo includere. Basato sulla regola L e l che hai mendtionato. Ciò significa 'przm2_LIBS = -L ../libanne4.0/lib -lwdm -ladwdm -lutil' non funziona perché il nome di queste librerie non è corretto? –

1

C'è qualcosa di sbagliato nel nome "adwdmlib.a". Un flag di collegamento "-l adwdm" dirà al compilatore di aspettarsi un file lib con il nome "libadwdm.a", non "adwdmlib.a". È utile o pertinente? Se il nome della tua libreria è "adwdmlib.a", probabilmente questo è il motivo per cui il tuo linker non riesce a trovarlo.

+0

Grazie per il commento. Ho provato a rinominare queste librerie, ma il linker non è riuscito a trovarle. –