複数の共有ライブラリを含むパッケージを作成したいとします。このパッケージにはおよびがlibfoo
含まれています。今の表記法を使うと想像してみてください。このようにコンパイルすると、すべてが正常です。liba.so.1
libb.so.1
liba.so.1
libb.so.1
cc -shared -fPIC -Wl,-soname,libb.so.1 -o libb.so.1 libb.c cc -shared -fPIC -Wl,-soname,liba.so.1 -o liba.so.1 liba.c libb.so.1
しかし、これにはいくつかの追加作業が必要です(依存関係を手動で把握してmakefileにエンコードする必要がありますが、sconsはこの操作を自動的には実行しないようです)。単純なメソッドをコンパイルすると、興味深い問題が発生します。
cc -shared -fPIC -Wl,-soname,libb.so.1 -o libb.so.1 libb.c cc -shared -fPIC -Wl,-soname,liba.so.1 -o liba.so.1 liba.c
これはヘッダーには表示されず、liba.so.1
Debianパッケージをビルドすると次のメッセージが表示されます(この手順は時間がかかります)。libb.so.1
DT_NEEDED
objdump -p
dh_shlibdeps dpkg-shlibdeps:警告:debian/libfoo1/usr/lib/liba.so.1で使用されているシンボルbは、どのライブラリでも見つかりません。
これはシンボルb
がに定義されているために発生しますlibb.so.1
が、dpkg-shlibdeps
これを知る方法はありません。
ここには実際の問題がないようです。実際のバイナリにはとliba
aslibb
があり、両方がDT_NEEDED
実行時にロードされます。それから数年が経ちました。この問題は、正しくクリーンに構築された Debian パッケージを作成しようとした場合にのみ発生します。
この問題をどのように解決するのですか? (しなければならない私はこの問題を解決しましたか? )このライブラリは実際には(TM)同じDebianパッケージになければなりません。 (ボーナスポイントの場合は循環依存関係を解決します。つまり、libb
シンボルも使用しますliba
。)