動的リンクライブラリのrpathはありますか?

動的リンクライブラリのrpathはありますか?

したがって、私が作業しているプロジェクトでは、システムディレクトリではなくディレクトリを使用して、コードで使用されているいくつかのDLLを保持します。システムディレクトリに入れたくないので、実行可能ファイルはDLLを見つけるためにrpathを設定します。しかし、ますます多くのライブラリが追加されるにつれて、そのディレクトリ内の他のDLLに依存するDLLがあります。

これらのライブラリは、リンカが探しているディレクトリ(システムディレクトリなど)にないため、自分が依存するDLLを見つけることができません。

DLLにこの特定の非システムディレクトリを検索させる方法はありますか? rpathと同じですか?図書館ではこれをどのように実行しますか?このプロジェクトで使用されるビルドシステムはCMakeです(回答に役立つ場合)。

ライブラリにrPathタグ​​がないため、この回答は機能しません。https://unix.stackexchange.com/a/272286/4193

を使ってみようかと思いましたが、うまくいきますが、LD_LIBRARY_PATH入力するのが面倒で、他の人に使うようにするのもあまり良くありません。rPathライブラリにタグを追加する方法がある場合は、それが最善の選択になります。

以前の関連質問と回答をご指摘いただきありがとうございます。

答え1

動的リンクライブラリのrpathはありますか?

まさにここに。-Wl,-rpathELF実行可能ファイルを使用するのと同じように、ELF共有オブジェクトを使用できます。私が思いついた小さな例を複製してください。 ここ:

git clone https://gist.github.com/ardrabczyk/6aeb8545c9b754d6b15be390af4bdff0

makeコンパイルを実行します。main ELF実行可能ファイルに必要なライブラリを確認してください。

$ readelf -d ./main

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libtwo.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [.]
(...)

どのライブラリが必要かを確認してくださいlibtwo.so

$ readelf -d ./libtwo.so

Dynamic section at offset 0xe38 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libone.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000f (RPATH)              Library rpath: [libs]
 (...)

ご覧のとおり、両方ともいくつかの共有オブジェクトがmain必要で、どちらもrpathが設定されています。libtwo.so./mainを実行するためにLD_LIBRARY_PATHを設定する必要はありません。

$ ./main
I'm in bar()

.main は常に現在のディレクトリで libtwo.so 依存関係を探し、libtwo.so は常にディレクトリlibsで libone.so 依存関係を探します。 ./main がないと起動しlibsません。

$ mv libs libs.bak
$ ./main
./main: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory

復元するには:

$ mv libs.bak libs
$ ./main
I'm in bar()

答え2

システムの一部と見なしたくないので、ユーザーアプリケーションとして使用してください。

~/.local/lib/に追加すると、LD_LIBRARY_PATHそこにすべてを置くことができます。~/.local/以下の部分的なFHS構造を作成してください。ゴミ箱など図書館そして共有する。これにより、プログラムを呼び出すために古い環境変数を使用する必要がなくなります。他のすべてのシステムでは、このディレクトリをライブラリパス環境変数に追加するだけです。とてもきれいでユニークです。

この解決策も拒否する場合は、可能性は1つだけです。すべてのシステムで予想される固定パスを使用することも、パスを含めて予想される環境変数を使用することもできます。

関連情報