0

Linuxの共有ライブラリをいじっていて、奇妙な問題が発生しました。共有ライブラリを正常に作成してlibrbmp.so.0ファイルを取得し、それをシンボリックリンクしてさらに2つのファイルを取得します:librbmp.solibrbmp.so.0.0.1。次に、それらをコピーし/usr/local/libて実行するldconfigと、ここで奇妙な動作が発生します。もう1つのファイルがに表示され/usr/local/libます。それはと呼ばれ--library=ibrbmp.so.0.0.1ます。奇妙なことに、私のアプリケーションは実行時にそれにリンクします。

何が起こっているのか、そして私のアプリを強制的にリンクさせる方法を知っている人はいlibrbmp.soますか?

コードは次のとおりです。

//creating shared library
$(CC) -shared -Wl,-soname,-librbmp.so.0.0.1 $(OBJECTS) -o librbmp.so.0 -lc

//symlinking
ln -sf librbmp.so.0.0.1 librbmp.so.0
ln -sf librbmp.so.0.0.1 librbmp.so
4

1 に答える 1

2

アプリケーションが実行時に使用する名前は、リンク時にライブラリに埋め込まれます。そのため、ビルドプロセスで、リンカーに奇妙なコマンドライン引数が導入されました。

リンカフロントエンドとして使用する場合gcc、引数はである必要があると思います-Wl,-soname=librbmp.so.0。あなたの電話では、余分な-ものがおそらく問題の原因です。実際のリンカーを呼び出す前に、何かがかなり愚かなことにすべてのインスタンスをに変換しているよう-lです。--library=-soname=--library=ibrbmp.so.0.0.1

また、sonameは通常、APIレベルの互換性を示す形式を指定する必要があることに注意してください。したがって、あなたの場合、sonameはでlibrbmp.so.0あり、実際の出力オブジェクトファイルはである必要がありますlibrbmp.so.0.0.1。そうすれば、ライブラリを改善するときにバージョンを増やすことができ、バイナリ互換性を壊さない限り、アプリケーションは引き続き機能します。ABIを壊すときは、sonameをにぶつける必要がありますlibrbmp.so.1

于 2012-07-20T20:58:36.747 に答える