2012-05-08 4 views
7

Ich habe einen Linker-Fehler, wo es undefinierten Verweis auf eine Funktion heißt. Die gemeinsame Bibliothek, in der ich die Funktion erwarte, hat den Funktionsnamen (ich habe das durch nm -s überprüft), also ist das nächste, was ich sehen möchte, ob die Funktionsparameter korrekt sind. Wie kann ich den Typ und die Anzahl der Parameter für eine Funktion in einer gemeinsamen Objektdatei sehen?Finden Sie die vollständige Funktionsdefinition in C++ freigegebene Objektdatei

EDIT: Also das Problem es kam, war zu sein: Ich habe versucht, ein C++ Shared Object-Datei zu erstellen, indem Sie einen gemeinsamen C Verknüpfungsobjekt, sondern in der C++ Quelle ich nicht enthalten den Header innen „extern“ C "" blockieren, so dass es diese Symbole nicht finden konnte, Danke an alle, die auf diese Frage geantwortet haben. Diese Frage ist jetzt gelöst.

+0

Was ist der "nm" Tag in dieser Frage? –

+0

@JohnDibling: 'nm' ist ein Befehl in Unix/Linux-Systemen, der Ihnen eine Liste von Symbolen in einer Objektdatei gibt. –

+1

Ah. Könnte besser sein, diese Frage zu markieren [linux] anstatt [nm] –

Antwort

2

Versuchen Sie, C++ filt auf den entstellten Namen auszuführen. Es wird entwirren und Sie können die Argumente sehen.

+0

Ja, ich leitete die nm-Ausgabe bereits zu C++ filt Programm um zu entmelden, es zeigt nur Den Funktionsnamen habe ich jetzt nochmal nochmal überprüft. Es zeigt auch T-Symbol davor, ich bin mir nicht sicher, was das bedeutet. – avd

+0

Ok ich lese, T bedeutet, dass die Objektdatei die Definition enthält, aber warum zeigt sie nicht die Parameter – avd

+0

Kannst du posten, was du oben bekommst? Dies kann helfen .. :) – tmaric

7

Sie nm mit der --demangle Option verwenden können:

nm -s --demangle libWhatever.so 

dass aus auf einer Probe .so versuchen, gibt mir Ausgabe wie

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

T bedeutet nur, dass es in den Objektdateien verwendet wird, um die .so zu erstellen, und nicht vom Linker aufgelöst werden muss.

+0

Der Großbuchstabe "T" bedeutet, dass das Symbol definiert ist und eine externe Verknüpfung hat. Solch ein Symbol, das in einem ".so" definiert ist, wird immer durch den dynamischen Linker zur Laufzeit aufgelöst und kann somit überlagert werden. –

2

Sie wollen wahrscheinlich:

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

Die oben demangles C++ Namen und zeigt nur Symbole im dynamischen Abschnitt definiert, die Symbole mit externer Bindung definiert ist, eine gegen verknüpfen.

0

So war das Problem, es zu sein war: Ich habe versucht, eine gemeinsame C++ - Objektdatei durch Verknüpfung eines gemeinsamen C Objekts erstellen, aber in der C++ - Quelle habe ich nicht den Header innerhalb "extern" C "" blockieren, so dass es nicht in der Lage war, diese Symbole zu finden, Danke an alle, die auf diese Frage geantwortet haben. Diese Frage ist jetzt gelöst.

Verwandte Themen