2010-05-03 12 views
5

Esiste un'utilità linux incorporata che è possibile utilizzare per testare una libreria condivisa appena compilata per riferimenti esterni non definiti? Gcc sembra essere abbastanza intelligente da verificare la presenza di simboli non definiti nel mio binario, ma se il simbolo è un riferimento a un'altra libreria, gcc non controlla al momento del collegamento. Invece ricevo il messaggio solo quando provo a collegarmi alla mia nuova libreria da un altro programma.Test per riferimenti esterni non definiti in Linux

Sembra un po 'sciocco ottenere messaggi di riferimento non definiti in una libreria quando sto compilando un progetto diverso, quindi voglio sapere se posso fare un controllo su tutti i riferimenti interni ed esterni quando costruisco la libreria non quando collego ad esso. Errore di

Esempio:

make -C UnitTests debug 
make[1]: Entering directory `~/projects/Foo/UnitTests` 
g++ [ tons of objects ] -L../libbar/bin -lbar -o UnitTests 
libbar.so: undefined reference to `DoSomethingFromAnotherLibrary` 
collect2: ld returned 1 exit status 
make[1]: *** [~/projects/Foo/UnitTests] Error 1 

risposta

2

Di solito, i riferimenti non definiti sono ammessi durante il collegamento oggetti condivisi, ma si può fare il linker genera un errore se ci sono i simboli non definiti nei file oggetto che si sta collegando per creare la libreria condivisa fornendo -z defs al linker (o allo stesso modo -Wl,-z,defs nel comando gcc che chiama il linker).

+0

haha, brillante. Ora posso dire chi sta chiamando la funzione non definita durante la compilazione della libreria! MOLTO meglio di un messaggio generico quando si collega alla libreria. Saluti! Sono curioso di sapere perché ld consente gli elementi esterni non risolti nelle librerie condivise ora. – Charles

+1

@Charles: È possibile (se insolito) avere simboli di oggetti condivisi risolti dai simboli nei file oggetto nell'eseguibile, quindi '-z defs' potrebbe non essere sempre Sii quel che vuoi essere. È anche possibile che la versione della libreria utilizzata al momento del collegamento finale potrebbe non essere la versione utilizzata al collegamento finale o il tempo di caricamento, quindi il collegamento finale potrebbe funzionare anche se '-z defs' avrebbe generato un errore in precedenza nel processo di compilazione. Nella maggior parte delle situazioni in cui ho creato oggetti condivisi, '-z defs' funziona ed è comunque utile. –

Problemi correlati