簡単な例を使用して、私の場合を説明します。
実装が異なる2 つのlibme.so ファイルがあり、それらが単一の設計で同時に機能することを確認済みです。1 つは ./root/v1/ にあり、もう 1 つは ./root/v2/ にあります。
私の「メイン」.so ファイルは、これら 2 つの libme.so ファイルにリンクされており、./root/libtest.so にあります。
今、私は物事を再配置可能にする必要があります。つまり、「ルート」ディレクトリ全体を別の場所または別のマシン (バイナリ互換性があると仮定) にコピーしても、問題なく動作するはずです。
私の質問は、これを機能させるには、libtest.so をビルドするためにどの gcc コマンドラインを使用すればよいですか?
私は次の2つを試しました:
(1)(「ルート」ディレクトリにいると仮定)
>gcc -shared -o libtest.so ./v1/libme.so ./v2/libme.so
これにより、libtest.so にこれら 2 つのリンクの依存関係が両方とも絶対パスで含まれるようになります。これは、ldd で確認できます。
>ldd libtest.so
/home/design/root/v1/libme.so
/home/design/root/v2/libme.so
もちろん、パスは固定されています。そのため、「ルート」ディレクトリを再配置すると、実行時に libme.so が見つかりません。この場合、ldd からのパスは絶対パスであるため、LD_LIBRARY_PATH の設定は機能しないことに注意してください。ランタイムローダーは、LD_LIBRARY_PATH を検索して libme.so を見つけません。
(2)
>gcc -shared -o libtest.so -lme -L./v1 -L./v2
これは、libme.so のバージョンが 1 つしかない場合にのみ機能します。この場合、./v2 のバージョンはリンクされません。同じ問題が -rpath にも存在します。
それを考えると、他にどのようなオプションがありますか?
いくつかの制限があることに注意してください: (1) libme.so の名前を libme_v1.so などの他の名前に変更することはできません (2) libtest.so は libme.so の両方のバージョンでリンクする必要があります