Domanda

Sto programmando in FORTRAN e C su un SGI con Irix 6.5, ma questo dovrebbe essere applicabile a tutti i sistemi simili a Unix. Come trovo quale libreria devo collegare al mio programma quando ottengo un "simbolo di testo non risolto" errore di collegamento? Ecco un esempio di ciò che vedo dal linker:

ld32: ERROR  33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a

Devo solo sapere quali librerie sono necessarie o c'è qualche strumento o comando che può aiutarmi a capirlo?

È stato utile?

Soluzione

Puoi usare il comando nm per elencare i simboli dinamici da una libreria condivisa:

nm -D /lib/libc.so.6

e quindi grep per il simbolo che stai cercando. Ometti la -D per le librerie statiche. Puoi usarlo in un ciclo o con xargs per scansionare più librerie.

Di solito uso solo Google (supponendo che il simbolo provenga da una libreria disponibile al pubblico).

Altri suggerimenti

Uso di nm (come in La risposta di Robert Gamble ) è la risposta corretta alla tua domanda. Il trucco è sapere dove cercare le librerie. Cosa fa il tuo programma? Se c'è una grande quantità di dati numerici in corso, è probabile che tu debba collegarti a librerie matematiche (come LAPACK o BLAS) e potresti voler iniziare a cercare lì. Anche la ricerca sul web può essere utile: ho digitato " ortho2 " nel mio motore di ricerca preferito e ho questo documentazione che suggerisce che si trova in libfgl.a

Tieni presente che quando esegui una ricerca dovresti probabilmente omettere il carattere di sottolineatura finale: di solito viene aggiunto al nome della routine dal compilatore.

Ho resistito alla tentazione di aggiungere questo alla risposta di Robert Gamble - considera questo un supplemento ad esso.

Diffida semplicemente dal presupposto che "qualsiasi corrispondenza" sia OK per l'uso. C'è stato un caso in un'altra domanda SO in cui un pezzo di codice è stato spostato da Windows a Unix e il codice di Windows utilizzava getch () per leggere un singolo carattere dall'input. L'utente ha attraversato un processo analogo a questo e ha trovato getch () su Unix nella libreria curses . Quindi, l'utente si è collegato alla libreria curses e si è chiesto perché il core del codice è stato scaricato. Il problema è che getch () effettivamente utilizzato presuppone che l'inizializzazione corretta sia stata eseguita e l'inizializzazione corretta non sia stata eseguita. In effetti, probabilmente non era la routine necessaria.

Su Solaris, ci sono opzioni per nm che indicano il nome della libreria e persino il file oggetto all'interno della libreria che contiene il simbolo (questi sono -r per il nome della libreria e -R per l'oggetto all'interno della libreria).

Attenzione anche ai nomi alterati in C ++. L'esempio ortho2 non è chiaramente alterato in C ++.

Se è una funzione standard, quale potrebbe essere ortho2, la pagina man ti dirà in quale libreria si trova.

Ho un po 'di lookfor script. Immettere lookfor func_name

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top