質問

私が開発したライブラリAがあります。マシンに展開すると、対応する libA.so および libA-X.Y.Z.so が/ usr / libに配置されます(X.Y.Zはバージョン番号です)。

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

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

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

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

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

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

役に立ちましたか?

解決

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

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

他のヒント

これはWindowsでも" DLL hell"として機能します。 :)。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top