1

複数のディレクトリの下で非標準の命名規則を使用して共有ライブラリをリンクすることに関して問題があります。実行可能ファイルの現在の場所で共有ライブラリを検索するには、生成された実行可能ファイルが必要ですが、この動作を強制するコマンド ライン パラメーターが見つかりません。

この動作を実証するために必要なのは、ディレクトリの下にある共有ライブラリだけです。

gcc -shared mylib.c -o some/dir/mylib.so

gcc main.c -o main -Lsome/dir -l:mylib.so

実行可能な mainは、次の ldd 出力を提供します。

ldd main
     some/dir/mylib.so (0xf76e2000)

私が必要とする出力は次のとおりです。

ldd main
     mylib.so => some/dir/mylib.so (0xf7700000)

この出力は、ライブラリの名前が慣例に従ってmylib.soではなくlibmylib.soである場合に作成できます。

mv some/dir/mylib.so some/dir/libmylib.so
gcc main.c -o main -Lsome/dir -lmylib

これにより、必要に応じて ldd リストのパスsome/dirも削除されます。

rpath の使用、および ld と gcc の両方のコマンド ライン オプションを調査しましたが、満足のいく解決策を見つけることができません。この場合、非標準の名前とディレクトリ構造の厳格な要件を簡単に変更することはできません。

私の質問は、ライブラリの依存関係を、gcc コマンド ライン オプションを介して 2 番目の ldd のように絶対ではなく、現在のディレクトリに対して強制的に相対的にする方法です。

お時間をいただきありがとうございます。問題を合理的に説明できたことを願っています。

ジョン。

4

2 に答える 2

1

共有ライブラリにsonameを追加してみてください:

$ gcc -shared mylib.c -o some/dir/mylib.so -Wl,-soname=mylib.so
$ gcc main.c -o main -Lsome/dir -l:mylib.so
$ LD_LIBRARY_PATH=some/dir:$LD_LIBRARY_PATH ldd main
        mylib.so => some/dir/mylib.so (0x00007fa7a4fd6000)
于 2013-06-25T13:41:40.780 に答える
0

これを行うために rpath に渡すことができる魔法の変数があります: $ORIGIN. 詳細man ld.soについては、を参照してください。

あなたの場合、コマンドは次のようになるはずです(テストされていません):

gcc main.c -o main -Lsome/dir -lmylib -Wl,-rpath,'$ORIGIN/some/path'

$ORIGINシェルをシェル変数として展開させてはならないことに注意してください。

ところで、これは「rpath relative」の最初の Google ヒットでした。

于 2013-01-04T10:01:48.953 に答える