それ自体がlibA.soに依存するlibB.soに依存する実行可能な C.exe とします。C.exeはlibAを直接使用しません。ツール ldd は、C.exe がまだ libA.so を必要としていることを示しています。
> ldd C.exe
libB.so => ./libB.so (0x00002b11cc4f5000)
libA.so.1 => ./libA.so.1 (0x00002b11cc719000)
<snip>
libA.so は、libB.so を調べたときにのみ表示されると思っていたでしょう。その動作を回避する方法はありますか、それとも正しいと思いますか?
私の問題は、libA をバージョン 2 に更新できるため、ライブラリ名が libA.so.2 に変更されることです。libB を再コンパイルしましたが、C.exe は再コンパイルしませんでした。どのlibAを選択するかを知っているlibBに依存しているため、C.exeが正常に動作することを期待していましたが、そうではありません。
その場合の処理方法は?
コンパイルとリンクの詳細
libA.so は次のようにコンパイルおよびリンクされます。
g++ -fPIC -Wall -shared -Wl,-soname,libA.so.1 libA.cpp -o libA.so.1
ln -s libA.so.1 libA.so
libB.so は次のようにコンパイルおよびリンクされます。
g++ -fPIC -Wall -shared -L. -lA libB.cpp -o libB.so
C.exe は次のようにコンパイルおよびリンクされます。
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
g++ -fPIC -Wall -L. -lB exeC.cpp -o C.exe