2012-05-08 6 views
7

Ho un errore del linker in cui viene indicato un riferimento non definito a una funzione. La libreria condivisa in cui mi aspetto che la funzione abbia il nome di quella funzione (ho controllato tramite nm -s) quindi ora la prossima cosa che voglio vedere è se i parametri della funzione sono corretti. Come posso vedere il tipo e il numero di parametri per una funzione in un file oggetto condiviso?Trova la definizione completa della funzione all'interno del file oggetto condiviso C++

EDIT: Quindi il problema è venuto per essere stato: stavo cercando di creare un file oggetto C++ condiviso collegando un condiviso C oggetto, ma nel sorgente C++ non ho incluso l'intestazione dentro "extern" C "" Blocca, quindi non è stato in grado di trovare quei simboli, grazie a tutti quelli che hanno risposto a questa domanda. Questa domanda è stata risolta ora.

+0

Qual è il tag "nm" su questa domanda? –

+0

@JohnDibling: 'nm' è un comando in sistemi unix/Linux che fornisce un elenco di simboli in un file oggetto. –

+1

Ah. Potrebbe essere meglio taggare questa domanda [linux] piuttosto che [nm] –

risposta

2

Provare a eseguire C++ filt sul nome di manchione. Lo sbloccerà e potrai vedere gli argomenti.

+0

Sì, ho reindirizzato l'output nm già al programma C++ filt per demangle, mostra solo il nome della funzione, ho ricontrollato ora. Inoltre mostra il simbolo T di fronte ad esso, non sono sicuro di cosa significhi. – avd

+0

Ok ho letto, T significa che il file oggetto contiene la definizione ma perché non mostra i parametri – avd

+0

Puoi pubblicare ciò che ottieni sopra? Questo può aiutare .. :) – tmaric

7

È possibile utilizzare nm con l'opzione --demangle:

nm -s --demangle libWhatever.so 

provare che su un campione di .so mi dà in uscita come

00005820 T dettaglio :: print_ (std :: ostream &, cv :: Mat const &, std :: string const &)

T significa semplicemente che si trova nei file oggetto utilizzati per creare lo .so e che non è necessario che il linker lo risolva.

+0

La "T" maiuscola significa che il simbolo è definito e ha un collegamento esterno. Tale simbolo definito in un '.so' viene sempre risolto dal linker dinamico in fase di esecuzione e quindi può essere sovrapposto. –

2

probabilmente si vuole:

nm --demangle --defined-only --dynamic x.so 

Le suddette demangles nomi C++ e mostra definito solo simboli nella sezione dinamica, che è definito simboli con collegamento esterno si può collegare contro.

0

Quindi il problema è stato: stavo cercando di creare un file oggetto condiviso C++ collegando un oggetto condiviso C, ma nel sorgente C++ non ho incluso l'intestazione all'interno di "extern" C "" blocco, quindi non è stato in grado di trovare quei simboli, grazie a tutti quelli che hanno risposto a questa domanda. Questa domanda è stata risolta ora.