1

Linuxで、gccとldがクリーンにビルドするケースがありますが、実行時に、プログラムを実行すると、自分の共有ライブラリの1つによって報告された未定義のシンボル(libxerces-c.so.28の何か)が表示されます。 。

最初の仮定は、キャッシュが壊れているか、xercesが最近インストールされたか、または同様のものであったため、ldconfigを実行しました。修正しませんでした。しかし、/ usr / libをld.so.confに追加してから、ldconfigを実行すると修正されました。

私の理解は/lib、/ usr / libであり、おそらく他の1つまたは2つのスポットは常にランタイムダイナミックリンカーによって検索されます。

??

(これは、jniを使用してアプリケーションの共有ライブラリにアクセスするJavaプログラムだけです。それが合理的であれば、このアプリケーションの過去N年間にいつでもこのエラーが発生するはずです。)

4

1 に答える 1

4

この特定のケースでは、ライブラリは/ usr / libにありましたが、別のプロジェクトにもありました(そして、リンカーは最初にそのプロジェクトを見つけていました)。そして、それは明らかにシンボルを欠いていたので、それは悪い/不完全なものだったに違いありません。

私は自分のプログラムを次のように実行することでこれを理解しました

LD_DEBUG=libs ./a.out

これにより、リンカーがさまざまな検索パスを掘り下げるのを見ることができ、間違ったパスを取得するのがわかりました。

ああ-そして明示的に/usr/ libをld構成に追加しますか?これにより、/ usr / libが通常よりも検索パスの早い位置に配置され、(運が良ければ)ldが悪いライブラリの前に良いライブラリを見つけられるようになりました。

于 2010-12-13T19:08:04.237 に答える