2

私が開発したライブラリAがあります。これをマシンにデプロイすると、対応するlibA.solibA-XYZsoが /usr/lib (XYZ はバージョン番号) に配置されます。

ここで、A を使用するライブラリ B を開発します。B をリンクするときは、フラグ -lA を使用します。次に、「ldd libB.so」は私に与えます:

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

私の問題は、A の新しいバージョン (XYZZ) をリリースするときに、B の新しいバージョンもリリースする必要があることです。そうしないと、最新の A をインストールする誰かが、バージョン XYZ を探す B をインストールできなくなります。存在しません。

この問題を解決するにはどうすればよいですか? B に libA-XYZso ではなく libA.so を探すように指示するにはどうすればよいですか? それともそうするのは間違っていますか?安全ではない?

更新 1 : ライブラリ A (他の誰かから継承したもの) は autotools を使用します。

更新 2 : ライブラリ A をビルドすると、「-Wl,-soname -Wl,libA-0.6.1.so」が表示されます。私が正しく理解している場合、それは soname をlibA-0.6.1.soにすることを強制していることを意味します。そうですか?今私の問題は、autotools を使用するプロジェクトでこの動作を変更する方法がわからないことです。しばらくグーグルで検索しましたが、有用な情報が見つかりません。configure.in または Makefile.am を変更する必要がありますか?

4

3 に答える 3

5

libA.so を作成するときに、-soname オプションをリンカーに渡します (gcc を介してリンクする場合は、-Wl,-soname を使用します)。次に、B がリンクされると、リンカはファイル名ではなく soname を介して A を参照します。ターゲット システムで、soname から実際のファイルへのリンクがあることを確認します。見る

http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

于 2008-10-31T10:04:36.827 に答える
0

2 回目の更新への回答: libA の Makefile.am で、_la_LDFLAGS を-releaseから-avoid-versionに変更しました。これにより、バージョン番号のない共有ライブラリが作成され、その後、このバージョン管理されていない共有ライブラリに対して正常にリンクされた libB を再コンパイルしました。

于 2008-10-31T14:21:43.950 に答える
0

これは、Windows でも「DLL 地獄」として機能します :)。

B が A の特定のバージョンを必要とし、libA-XYZ ではなく libA にリンクする場合、libA を新しいバージョンに置き換えるだけで、B がロードされないかクラッシュする可能性があります。

もちろん、libA-XYZ から libA-X1.Y1.Z1 へのシンボリック リンクを作成することもできます。API が変更されておらず、実装のみが変更されている場合は安全です。

于 2008-10-31T07:59:18.250 に答える