2011-07-30 14 views
2

/some/libにある共有ライブラリlibA.soから始めます。 libA.soの機能に依存するライブラリ(libB.so)をビルドします。ですから、libB.soを作成するときには、g ++のコマンドラインに-L/some/lib -lAを含めます。 libB.soも/ some/libにあります。リンクの依存関係

今、libB.soを使用する実行可能ファイルをビルドします。私は期待される-L/some/libと-lBをg ++リンカに提供します。しかし、 "libA.so"が見つからないため、エラーが発生します。リンカー行に "-lA"を追加すると、プログラムがリンクします。

なぜ「libA.so」が見つからないのかわかりません。私は確かになぜリンカの行に "-lA"を含めることがそれを見つけることができます理解していない。 libA.soが必要であることが既に分かっているようで、libA.soはlibB.soと同じパスにあります。

誰かがこれを説明することはできますか?私はlibB.soをリンクしたいすべての実行可能ファイルに明示的に "-lA"を入れなければならないという考えが嫌いです。私は何か間違ったことをしましたか?

答えて

4

libBとのみリンクしている間、リンカーは、libAを探しますが、リンカー/ローダーの検索可能なパスにないため、見つからないことがあります。リンク段階でLD_LIBRARY_PATH(および/またはLD_RUN_PATH)を設定するか、libB-rpath /some/libにリンクする必要があります。

ちょうどlibBが実行可能であると思ったら、それをfooと呼んでみましょう。 libAが見つからないので、コマンドラインで./fooと言うだけではありません(ローダーパスを調べるにはldd fooをチェックしてください)。代わりに

LD_LIBRARY_PATH=/some/lib ./foo 

またはrpathでコンパイルする必要があります。 (g++の場合は、g++ -Wl,-rpath,/some/lib ...と指定すると、リンカーにオプションが渡されます)。同じロード時の解決プロセスが、ダイナミックライブラリ自体に適用されます。

+0

なぜ "-lA"はそれを検索可能なパスに入れますか?私は "-lA"が見つかる必要のあるオブジェクトのリストに入れています。 – John

+0

簡単なプログラムを試してみましょう: 'g ++ -o foo foo.o - lA -L/some/lib'の場合、* linker *はライブラリ 'libA'を見つけますが、* loader *が見つからないためプログラムを実行できません。私の例のように 'LD_LIBRARY_PATH'を設定してプログラムを実行する必要があります。リンクと読み込みを混同しないでください! –

+0

最終実行ファイルがlibBの関数/クラスのみを使用する場合、なぜlibAとリンクする必要があるのでしょうか?窓では、本当にする必要はありません。 –