したがって、私が作業しているプロジェクトでは、システムディレクトリではなくディレクトリを使用して、コードで使用されているいくつかのDLLを保持します。システムディレクトリに入れたくないので、実行可能ファイルはDLLを見つけるためにrpathを設定します。しかし、ますます多くのライブラリが追加されるにつれて、そのディレクトリ内の他のDLLに依存するDLLがあります。
これらのライブラリは、リンカが探しているディレクトリ(システムディレクトリなど)にないため、自分が依存するDLLを見つけることができません。
DLLにこの特定の非システムディレクトリを検索させる方法はありますか? rpathと同じですか?図書館ではこれをどのように実行しますか?このプロジェクトで使用されるビルドシステムはCMakeです(回答に役立つ場合)。
ライブラリにrPathタグがないため、この回答は機能しません。https://unix.stackexchange.com/a/272286/4193
を使ってみようかと思いましたが、うまくいきますが、LD_LIBRARY_PATH
入力するのが面倒で、他の人に使うようにするのもあまり良くありません。rPath
ライブラリにタグを追加する方法がある場合は、それが最善の選択になります。
以前の関連質問と回答をご指摘いただきありがとうございます。
答え1
動的リンクライブラリのrpathはありますか?
まさにここに。-Wl,-rpath
ELF実行可能ファイルを使用するのと同じように、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つだけです。すべてのシステムで予想される固定パスを使用することも、パスを含めて予想される環境変数を使用することもできます。