Domanda

Sto provando a compilare codice fortran e sono in esecuzione in alcune confusione collegamento degli errori.Ho un po ' di codice che ho compilare e inserire in una libreria statica:

>gfortran -c -I../../inc -o bdout.o bdout.F
>ar rv libgeo.a bdout.o

Cerco allora di compilare contro libreria con qualche semplice codice di test e ottenere la seguente:

>gfortran -o mytest -L -lgeo mytest.F
/tmp/cc4uvcsj.o: In function `MAIN__':
mytest.F:(.text+0xb0): undefined reference to `ncwrite1_'
collect2: ld returned 1 exit status

La denominazione degli oggetti, perché tutto sembra funzionare bene:

>nm -u libgeo.a

bdout.o:
     U _gfortran_exit_i4
     U _gfortran_st_write
     U _gfortran_st_write_done
     U _gfortran_transfer_character
     U _gfortran_transfer_integer
     U ncobjcl_
     U ncobjwrp_
     U ncopencr_
     U ncopenshcr_
     U ncopenwr_
     U ncwrite1_
     U ncwrite2_
     U ncwrite3_
     U ncwrite4_
     U ncwritev_

Posso controllare l'oggetto originale file di troppo:

>nm -u bdout.o

     U _gfortran_exit_i4
     U _gfortran_st_write
     U _gfortran_st_write_done
     U _gfortran_transfer_character
     U _gfortran_transfer_integer
     U ncobjcl_
     U ncobjwrp_
     U ncopencr_
     U ncopenshcr_
     U ncopenwr_
     U ncwrite1_
     U ncwrite2_
     U ncwrite3_
     U ncwrite4_
     U ncwritev_

Il codice di test contiene semplicemente una singola chiamata a una funzione definita in bdout.o:

program hello
        print *,"Hello World!"
        call ncwrite1( istat, f, ix2, ix3, ix4, ix5, ih )
end program hello

Io non riesco a capire quale sia il problema.Qualcuno ha qualche suggerimento?Forse anche un modo per tenere traccia del problema?

Ciao.

È stato utile?

Soluzione 4

Innanzitutto, grazie a tutti coloro che hanno risposto.Sto postando per porre fine ufficiale di questo thread.Si scopre che la persona che ha scritto la biblioteca (libgeo.a) aveva messo diversi #ifdef istruzioni in codice che sono state attivate utilizzando il flag del compilatore macro -D(macro).Questi #ifdef, avrebbe quindi essere utilizzato per espandere i nomi di funzione con parametri specifici.Senza fornire le opportune macro al compilatore i nomi delle funzioni sono state lasciate non espandibili, e I simboli sono stati così indefinito.Grrrr...

Altri suggerimenti

Non so se questo aiuta questo particolare problema, ma in generale, sempre messo i comandi del linker DOPO i file oggetto. In secondo luogo, se libgeo.a si trova nella directory corrente, è necessario aggiungere che in modo esplicito, un vuoto -L per quanto ne so non fa nulla. Cioè.

gfortran -o mytest mytest.F -L. -lgeo

EDIT: Si noti inoltre che la "U" nei mezzi di uscita nm che il simbolo non è definito. Cioè che i riferimenti ai file .o detto simbolo, ma il simbolo è in realtà in qualche altro file. Cioè potrebbe essere necessario in modo esplicito collegamento nella libreria che definisce il simbolo ncwrite1_.

Il problema è che non si sta collegando contro il biblioteca che contiene tale funzione. Ci sono due possibili ragioni per questo:

  1. La funzione ncwrite1 non è definita nelle librerie che si sta collegando contro. Utilizzare nm per verificare che questo è (o non è) il caso.
  2. Le librerie sono poste prima che i file di codice oggetto / sorgente sulla riga di comando (!) Dei linker sono proprio le cose più stupide mai, e non tentare di tutto risolutezza contro tutto il resto (e questo è a volte utile per tecniche avanzate) ma che significa che è necessario mettere le librerie dopo tutto il resto . Se si dispone di molte librerie, è necessario utilizzare una sorta topologico sulle dipendenze tra loro per determinare l'ordine corretto per loro lista per il linker.

Se si assume che la biblioteca geo ha la funzione che stai dopo (verificare che!), Allora si dovrebbe costruire e link come questo:

gfortran -o mytest -L. mytest.F -lgeo

Il problema potrebbe essere che la chiamata a ncwrite1 non corrisponde alla firma della definizione biblioteca del subroutine e ciò che il messaggio di errore è veramente cercando di dirvi è che non riesce a trovare una versione di ncwrite1 con una firma per abbinare la chiamata. Il vostro programma non sembra utilizzare un'interfaccia esplicito ncwrite1 così errori di tipo del genere non saranno catturati a tempo di compilazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top