Linuxでライブラリの複数のインスタンスを持つことができるかどうかを知りたいです。
例:
- ソフトウェアAが動作するには、ライブラリX以下の1.0、1.1、または1.2分岐が必要です。
- ソフトウェアBが動作するには、ライブラリXの第1.4四半期または最新の1.xが必要です。
- ソフトウェアCが動作するには、ライブラリXの2.0分岐以上が必要です。
3つのソフトウェアがすべて正しく動作するようにLibrary X 1.2、1.8、2.3をインストールできますか?
答え1
単一のライブラリの複数のバージョンをインストールできますか?
もちろん! *nixでパッケージを管理すると、実際にこれはとても簡単です。必要な唯一のことは、パッケージがクラッシュしないことです(つまり、パッケージャがいくつかのトリックを実行する必要があるかもしれません)。しかし、実際の質問にはより深い答えが必要です。
このように複数のバージョンのライブラリをインストールすると、さまざまなバージョンのソフトウェアを使用できますか?
おそらく。これは、各ソフトウェアが必要なライブラリにどのように接続されるかによって異なります。たとえば、を見ると、ほとんどのライブラリには、/usr/lib
このディレクトリに少なくとも2つの異なるファイルがあることがわかります(libname.so
ここでは数字libname.so.#.#.#
です)。これは通常、2番目のファイルへのシンボリックリンクであることが#
わかります。libname.so
通常、ソフトウェアは、特定のバージョンのライブラリまたはバージョンが指定されていないライブラリのすべてのバージョン(通常は最新バージョン)にリンクすることを選択できるためです。
各ソフトウェアで使用されているライブラリのバージョンに対する特定の要件がある場合は、バージョンのないライブラリが目的のバージョンになるのではなく、必要なバージョンを選択できるようになりました。このような場合は、おそらく家に戻ってやるべきことは、他のライブラリバージョンを正しくインストールすることです。ただし、これらのソフトウェアのいずれかがバージョン管理されていないリンクにリンクされているが、そのリンクがライブラリの特定のバージョンであると予想している場合、バージョン指定されていないリンクが期待されたバージョンでなければ機能しません。
たとえば、説明します。 Arch Linuxでは、2つのバージョン(および)が正式libpng
にパッケージ化されています。偶然両方とも設置してみました。1.2
1.6
$ ls -l /usr/lib | grep png
lrwxrwxrwx 1 root root 18 Mar 12 08:05 libpng12.so -> libpng12.so.0.51.0*
lrwxrwxrwx 1 root root 18 Mar 12 08:05 libpng12.so.0 -> libpng12.so.0.51.0*
-rwxr-xr-x 1 root root 168K Mar 12 08:05 libpng12.so.0.51.0*
lrwxrwxrwx 1 root root 19 Jun 27 19:53 libpng16.so -> libpng16.so.16.12.0*
lrwxrwxrwx 1 root root 19 Jun 27 19:53 libpng16.so.16 -> libpng16.so.16.12.0*
-rwxr-xr-x 1 root root 216K Jun 27 19:53 libpng16.so.16.12.0*
lrwxrwxrwx 1 root root 11 Jun 27 19:53 libpng.so -> libpng16.so*
このファイルセットを見るとlibpng.so
(完全にバージョンが指定されていないリンク)が、libpng16.so
(sonameのないバージョンが指定されたリンク)を指すことがわかりますlibpng.so.16.12.0
。libpng.so
に接続しますlibpng.so.16.12.0
。ソフトウェアが期待していることがこれであることを願っています。ただし、ソフトウェアに実際にそのバージョンが必要な場合は1.2
問題が発生します。
ここで重要なのは、ソフトウェアをパッケージ化する場合は、ハードライブラリのバージョン要件が何であるかを特定し、コンパイル段階で正しいバージョンに接続されていることを確認することです。あなたが開発者であれば、リンクするすべてのライブラリの最新バージョンでソフトウェアを最新の状態に保つ必要があるというレッスンを得ることができます(それで直接リンクできればlibname.so
大丈夫でしょう)。または、何に依存しているのかを知る必要があります。 onであり、それをサポートするライブラリのバージョンにのみリンクするだけです。