質問: so(共有オブジェクト)番号はどのように機能しますか? linuxでの共有オブジェクトは「so番号」を使用すること、つまり、共有オブジェクトの異なるバージョンには異なる拡張子が与えられることを知っています。たとえば、次のようになります。 example.so.1 example.so.2 ライブラリの2つのバージョンがシステムに存在できるように、2つの異なるファイルを使用するという考えを理解しています(windowsの「dll hell」とは対照的です)。これが実際にどのように機能するか知りたいですか?多くの場合、example.soは実際にはexample.so.2へのシンボリックリンクであることがわかります。ここで、.2は最新バージョンです。古いバージョンのexample.soに依存するアプリケーションは、それをどのように正しく識別しますか?どの数字を使用する必要があるかについての規則はありますか?それともこれは単に慣習ですか?システム間でソフトウェアバイナリが転送されるwindowsとは異なり、システムに新しいバージョンの共有オブジェクトがある場合、ソースからコンパイルすると、古いバージョンに自動的にリンクされますか。これはldconfigに関連しているのではないかと思いますが、方法はわかりません。
回答: 共有ライブラリは、次のスキームに従ってバージョン管理する必要があります。blah.so.x.y.z どこ x =下位互換性のないabiリリース y =下位互換性のあるabiリリース z =内部変更のみ-abiへの変更なし 他のすべての桁は下位互換性があるため、通常、最初の桁はhello.so.1のような最初の桁のみが表示されます。これは、最初の桁がライブラリの「バージョン」を識別するために必要な唯一の桁だからです。ldconfigは、システムで使用可能な共有ライブラリと、そのライブラリへのパスが存在する場所のテーブルを保持します。これを確認するには、次のコマンドを実行します。ldconfig -p red hatなどのパッケージがビルドされると、バイナリで呼び出されている共有ライブラリが検索され、rpmビルド時にパッケージの依存関係として追加されます。したがって、パッケージをインストールするときに、インストーラーはldconfigをチェックして、hello.so.1がシステムにインストールされているかどうかを調べます。次のようなことを行うと、パッケージの依存関係を確認できます。rpm -qpr hello.rpm このシステム(windowsとは異なります)では、hello.soの複数のバージョンをシステムにインストールして、さまざまなアプリケーションで同時に使用できます。