11

たとえば、2 つのトースター ライブラリlibtoaster_a.solibtoaster_b.soと、関連するすべてのメジャー/マイナー/リビジョン シンボリック リンク(libtoaster_a.so.1.0.0など) など、2 つのライブラリがあります。どちらのライブラリも同じトースター インターフェイスを実装していますが、単に処理を行うだけです。違う。したがって、ライブラリを使用するアプリケーションを構築する場合、どちらを使用しても問題ありません (アプリケーションの観点からは、それらは同じです)。

アプリケーションをコンパイルして配布した後で、使用するライブラリを決定したいので、libtoaster.so.1 を指すシンボリックリンクlibtoaster.so作成ます。 1 . したがって、ユーザー/インストーラーはlibtoaster.so.1リンクを変更するだけで、使用する実装を選択できます。

ビルドでは、デフォルトで libtoaster.so.1 がlibtoaster_a.so.1リンクされているとします。アプリケーションをコンパイルすると、たとえばmy_appのようなものがコンパイルされ、 libtoaster_a.so.1で正しく実行されます。ただし、ldd を my_app で実行すると、必要に応じてlibtoaster.so.1ではなくlibtoaster_a.so.1にリンクされていることがわかります。したがって、 libtoaster.so.1リンクを変更しても効果はありません。gcc -o my_app -ltoaster...

libtoaster_a.so.1 を作成し、名前をlibtoaster.so.1に変更し、 このライブラリに対してmy_appを作成してからlibtoaster.so.1を削除し、シンボリック リンクとして再度作成するよりも、これを修正する良い方法はありますか?

4

1 に答える 1

8

共有ライブラリをビルドするときは、"-Wl,-soname=libtoaster.so.1" を gcc フラグに追加します (gcc とリンクしていると仮定します)。これにより、ライブラリに DT_SONAME が設定され、そのライブラリにリンクされたすべてのアプリケーションが、ファイル名ではなく DT_SONAME から取られたライブラリ名を持つようになります。

[vps@manticore]~/cprog/toaster1$ gcc -c my_app.c
[vps@manticore]~/cprog/toaster1$ gcc -c toaster.c
[vps@manticore]~/cprog/toaster1$ gcc -o libtoaster_a.so -shared -Wl,-soname=libtoaster.so toaster.o
[vps@manticore]~/cprog/toaster1$ gcc -R$(pwd) -L. -ltoaster_a -o my_app my_app.o
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
my_app: can't load library 'libtoaster.so'
my_app: exit status 4
[vps@manticore]~/cprog/toaster1$ ln -s libtoaster_a.so libtoaster.so
[vps@manticore]~/cprog/toaster1$ ldd my_app
my_app:
    Start    End      Type Open Ref GrpRef Name
    1c000000 3c004000 exe  1    0   0      my_app
    05b1f000 25b23000 rlib 0    1   0      /home/vps/cprog/toaster1/libtoaster.so
    084f9000 28532000 rlib 0    1   0      /usr/lib/libc.so.51.0
    09e80000 09e80000 rtld 0    1   0      /usr/libexec/ld.so
[vps@manticore]~/cprog/toaster1$
于 2011-06-14T06:40:45.607 に答える