3

これが私がしたことです:

から.hファイルを変更しました

SomeObj* getCacheObj( int i = 0 );

SomeObj* getCacheObj( int i );
SomeObj* getCacheObj();

コードを再コンパイルしました (問題ありません)。変更は somelib.so (多くのso ファイルの 1 つ) に行われました。次に、機器の古い so をこれに置き換えましたが、so をロードするときに次のエラーが発生しました。 undefined symbol: _ZN13KeypathHelper11getCacheObjEv

ここで奇妙なのは、このクラスはこの so ファイルでのみ使用されると言われたことです (どうすれば確認できますか?)。私はそれほど経験がなく、調査方法がわかりません。どんな提案でも大歓迎です。

アップデート

この特定の問題は、別のファイルが KeypathHelper クラスを使用していたため、それを含むファイルのみを置き換えたために発生しました。他に更新する必要があるものを見つける方法は、KeypathHelper のすべての so を grep することでした。

4

1 に答える 1

4

_ZN13KeypathHelper11getCacheObjEv記号は のマングル名です(たとえば、 をKeypathHelper::getCacheObj()使用して簡単に翻訳できます)。c++filtメソッドを追加しただけで、共有オブジェクトをロードしているものを見つけることができない場合、共有オブジェクトを更新していないか、定義を提供するのを忘れているKeypathHelper::getCacheObj()(つまり、メソッドを実装する) と思います。

調査するには、シンボルの解決に失敗しているものを確認する必要があります。通常、開発者はそれに対する感覚を持っています。たとえば、未解決のシンボルが原因でバイナリXXXがライブラリを読み込めない場合、それを使用していて、 (または他の場所に)存在していないように見えます。その意味がない場合は、ld.so (8) マニュアル ページを読んで、定義などの利用可能な手段を使用して動的リンカをデバッグすることに頼ることができます。YYYXXXYYYLD_DEBUG

また、@PlasmaHH は非常に良い質問をしました。ヘッダー ファイルのみを変更した場合、パラメーターの既定値を持つ 1 つの関数/メソッドは、1 つがパラメーターを持ち、もう 1 つがパラメーターを持たない 2 つの関数/メソッドと同じではないことを知っておく必要があります。

共有オブジェクト内のシンボルが外部で使用されていないことを確認する方法に関する 2 番目の質問については、シンボルの可視性を変更して、外部から誰もシンボルをリンク/解決/使用できないようにする必要があります。たとえば、GCC の可視性を参照してください。

それが役に立てば幸い。幸運を!

于 2013-02-26T14:30:54.587 に答える