2012-05-08 13 views
7

関数への未定義の参照がある場合、リンカーエラーが発生します。機能が期待される共有ライブラリはその関数名を持っています(nm-sをチェックしました)ので、次は関数のパラメータが正しいかどうかを確認してください。共有オブジェクトファイル内の関数のパラメータのタイプと数を確認するにはどうすればよいですか?C++共有オブジェクトファイル内の完全な関数定義を見つける

EDIT:だから、それがために来た問題だった:私は共有Cオブジェクトをリンクすることにより、C++共有オブジェクトファイルを作成しようとしていたが、C++ソースで、私は「のextern」C内部ヘッダが含まれていませんでした""ブロックするので、これらのシンボルを見つけることができませんでした。この質問に答えるすべての人に感謝します。この質問は今解決されました。

+0

この質問の「nm」タグとは何ですか? –

+0

@JohnDibling: 'nm'は、UNIX/Linuxシステムのコマンドで、オブジェクトファイル内のシンボルのリストを提供します。 –

+1

Ah。この質問は、[nm]ではなく[linux]とタグ付けする方が良いかもしれません。 –

答えて

2

マングルされた名前でC++ filtを実行してみてください。それを解くと、引数を見ることができます。あなたが--demangleオプションでnmを使用することができます

+0

はいnm出力を既にC++ filtプログラムにリダイレクトしてdemangleしました。関数名、私は今再びダブルチェックしました。また、その前にTのシンボルが表示されていますが、その意味が分かりません。 – avd

+0

Ok私は、オブジェクトファイルには定義が含まれているが、そのパラメータが表示されない理由を教えています。 – avd

+0

上記の情報を投稿できますか?これは役に立ちます:.. – tmaric

7

nm -s --demangle libWhatever.so 

サンプル.soの上でそれを試しては

00005820 T詳細:: print_(のstd :: ostreamにと私にこのような出力を提供します&、CV ::マットconstの&、STD ::文字列のconst &)

Tは、それが.soの作成に使用されたオブジェクトファイル内にあることを意味し、リンカによって解決される必要はありません。

+0

大文字の「T」は、シンボルが定義され、外部リンケージを持つことを意味します。 '.so'で定義されたそのようなシンボルは、実行時に常にダイナミックリンカによって解決されるため、スーパーインポーズすることができます。 –

2

あなたはおそらくしたい:

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

上記デマングルC++の名前、もう1つはにリンクすることができ、外部リンケージでシンボルを定義している動的セクションでのみ定義されたシンボルを、示しています。

0

だから、それがためになった問題があった。私は共有Cオブジェクトをリンクすることにより、C++共有オブジェクトファイルを作成しようとしていたが、C++ソースに私が「のextern 『C』」内部ヘッダが含まれていませんでしたブロックしたので、これらのシンボルを見つけることができませんでした。この質問に答えるすべての人に感謝します。この質問は今解決されました。

関連する問題