1

それ自体が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
4

1 に答える 1

1

libA をスタティック ライブラリとして作成する必要があります (を使用ar)。そうすれば、そのコードは libB.so に埋め込まれ、追加の依存関係はなくなります。

于 2012-05-02T12:29:17.027 に答える