ここでld の-rpath
オプションを使用する基本的な例を作成しました(動作するバージョンについては、2 番目の応答を参照してください)。にリンクし、次に にリンクし、すべてとを使用する例を作成しようとしています。$ORIGIN
main.run
foo.so
bar.so
rpath
$ORIGIN
実行時のファイル構造は次のとおりです。
- 事業/
- ライブラリ/
- dir/
- サブ/
- bar.so
- foo.so
- 走る/
- main.run (ビルドに失敗)
以下を使用して foo.so を構築しています。
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/dir/foo.so obj/foo.o -Wl,-soname,foo.so -Wl,-rpath,'$ORIGIN/sub' -Llib/dir/sub -l:bar.so
これは問題なく構築されます。ldd lib/dir/foo.so
見つけることさえできますbar.so
。
しかし、 にリンクしようとするとmain.run
、foo.so
bar.sofoo.so
が見つかりません。
以下を使用して main.so を構築しています。
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib/dir' -Llib/dir -l:foo.so
foo.so
再帰的にリンクしない別のバージョンの が使用されている場合、これは正常に機能します。(以下のプロジェクトの make.sh の行のコメントを外してテストします)。
ただし、通常の使用では、foo.so
ビルド時にこのエラーが発生しますmain.run
:
/usr/bin/ld: 警告: lib/dir/foo.so に必要な bar.so が見つかりません (-rpath または -rpath-link を使用してみてください)
だから私の質問は:
- foo.so
$ORIGIN
内ではproject/lib/dir
(wherefoo.so
is) またはproject/run
(wheremain.run
(リンクしている実行可能ファイル) is) に解決されますか?
ldd は、それが であることを示しているように見えますがproject/lib/dir
、これが最良の方法と思われます (ただし、両方を想定してみました)。 - これらをリンクするにはどうすればよいですか(再配置可能性を維持しながら)-できれば
-rpath-link
.
プロジェクトはこちらからダウンロードできます。それは私がそれを作ることができるのと同じくらい簡単です。4 つの短いソースとスクリプト。
解凍後、./make.sh
内から実行するだけproject/
です。
注:を使用して-l:
います。foo.so
これは、ライブラリの名前が ではなく のようになり、の代わりにでlibfoo.so
ランク付けされることを除いて、何も変更されません。-l:foo.so
-lfoo