2つの共有ライブラリ(コンパイルしたもの)を使用するプログラムを作成し、次のように配置しました。
/home_directory_where_I_compile_and_run_everything
-->/lib/libjson_linux-gcc-4.4.6_libmt.so
-->/lib/libre2.so.0
プログラムをコンパイルするとき、次のように、これらのライブラリの相対的な場所をリンカーに渡します。
g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/libre2.so.0
そしてそれはうまくコンパイルされます、しかしプログラムを実行するときそれはlibre2.soを見つけることができません、そして私がそれをlddで調べるならば、これは何が起こるかです:
....
lib/libjson_linux-gcc-4.4.6_libmt.so (0x00007f62906bc000)
libre2.so.0 => not found
....
どうやら、libjsonのパスは相対的であることを認識していますが、libre2.so.0ではそれを行いません(すべてのパスをトリミングし、libre2.so.0をそのままにします)
なぜこれが起こるのか誰かに教えてもらえますか?
また、g ++引数を介してこれを変更する方法はありますか?
一番。
*更新*おっ、これをチェックしてください!libre2.so.0の名前をstuff.soに変更してから、基本的に次のようにコンパイルしようとしました。
g++ ...... stuff ........ my_program.cc lib/libjson_linux-gcc-4.4.6_libmt.so lib/stuff.so
そしてそれはとにかく失敗します。失敗するだけでなく、「libre2.so.0」が見つからないため失敗します。
なんで?
*アップデート#2 *
の出力readelf -d the_program.o
0x0000000000000001 (NEEDED) Shared library: [lib/libjson_linux-gcc-4.4.6_libmt.so]
0x0000000000000001 (NEEDED) Shared library: [libre2.so.0]
さて、その[libre2.so.0]を[lib / libre2.so.0]にすることができれば、それで問題ありません。
*アップデート#3 *
@troubadourが見つけたように:
実行可能ファイルがDT_SONAMEフィールドを持つ共有オブジェクトにリンクされている場合、実行可能ファイルが実行されると、ダイナミックリンカは、リンカに指定されたファイル名を使用するのではなく、DT_SONAMEフィールドで指定された共有オブジェクトをロードしようとします。
これが、libre2.so.0ではなくlibjson.....soで機能する理由です。(libjson ..... soにはSONAMEのエントリがありません)。
そして、私はついに私が探しているものについての正確な質問を見つけました:
共有ライブラリファイルのSONAMEエントリを無視し、代わりに特定のファイルパスにリンクするようにgccリンカーに指示する方法はありますか?