2012-05-08 18 views
7

Mam błąd linkera, który wskazuje niezdefiniowane odniesienie do funkcji. Biblioteka współdzielona, ​​w której oczekuję, że funkcja ma tę nazwę funkcji (sprawdziłem przez nm-s), więc teraz kolejną rzeczą, którą chcę zobaczyć, jest to, czy parametry funkcji są poprawne. Jak wyświetlić typ i liczbę parametrów dla funkcji w pliku obiektu współużytkowanego?Znajdź pełną definicję funkcji wewnątrz pliku obiektów udostępnionych C++.

EDYCJA: Problem w tym, że powstał: Próbowałem utworzyć plik obiektów wspólnych w C++, łącząc udostępniony obiekt C, ale w źródle C++ nie zawierałem nagłówka wewnątrz "zewnętrznego" C "" blok, więc nie był w stanie znaleźć tych symboli, Dziękuję wszystkim, którzy odpowiedzieli na to pytanie. To pytanie zostało już rozwiązane.

+0

Co to jest tag "nm" w tym pytaniu? –

+0

@JohnDibling: 'nm' jest poleceniem w systemach unix/Linux, które daje listę symboli w pliku obiektowym. –

+1

Ah. Lepiej oznaczyć to pytanie [linux] niż [nm] –

Odpowiedz

2

Spróbuj wykonać C++ filt na zniekształconej nazwie. Odblokuje go i zobaczysz argumenty.

+0

Tak Przekierowałem już wyjście nm do programu C++ filt w celu zmapowania, pokazuje tylko nazwa funkcji, ponownie sprawdziłem ponownie. Również pokazuje symbol T przed nim, nie jestem pewien, co to znaczy. – avd

+0

Ok Czytam, T oznacza, że ​​plik obiektowy zawiera definicję, ale dlaczego nie pokazuje parametrów – avd

+0

Czy możesz napisać, co otrzymujesz powyżej? To może pomóc .. :) – tmaric

7

Można użyć nm z opcją --demangle:

nm -s --demangle libWhatever.so 

że stara się na .so próbki daje mi moc taką jak

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

T oznacza po prostu, że znajduje się w plikach obiektów użytych do utworzenia .so i nie musi być rozwiązany przez linker.

+0

Kapitał 'T' oznacza, że ​​symbol jest zdefiniowany i ma zewnętrzne powiązanie. Taki symbol zdefiniowany w '.so' jest zawsze rozwiązywany przez dynamiczny linker w czasie wykonywania, a zatem może być nałożony. –

2

Prawdopodobnie chcesz:

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

Powyższe demangles C++ i nazwiska znajdują się jedynie symbole zdefiniowane w dynamicznej sekcji, który jest zdefiniowany symbole z zewnętrznym łącznikiem można połączyć przeciwko.

0

Tak więc powstał problem: próbowałem utworzyć plik wspólnych obiektów C++, łącząc udostępniony obiekt C, ale w źródle C++ nie zawarłem nagłówka wewnątrz "extern" C "" blok, więc nie był w stanie znaleźć tych symboli, Dziękuję wszystkim, którzy odpowiedzieli na to pytanie. To pytanie zostało już rozwiązane.

Powiązane problemy