23

共有ライブラリを構築しようとしています。libabc.so としましょう。別の .so ファイル、たとえば lib123.so (/usr/local/lib の lib) を使用します。今、アプリケーションで共有ライブラリ libabc.so を使用しています。これらのバイナリをどのようにリンクすればよいか知りたいですか?? my-app を lib123.so に直接リンクしたくありません。my-app は libabc.so のみとリンクする必要があります。これどうやってするの?

前もって感謝します。g++ コンパイラを使用しています

4

3 に答える 3

29

位置独立オブジェクト コード ファイルおよびlibabc.soから取得されたとします。次に、たとえばでそれらを構築しましたabc1.pic.oabc2.pic.o

 gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
 gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o

そして、あなたはで構築libabc.soします

gcc -shared  abc1.pic.o  abc2.pic.o -L/usr/local/lib -l123 -o libabc.so

共有ライブラリがあると想定しているため、-L/usr/local/lib に追加しました。-l123/usr/local/lib/lib123.so

Program Library HowToもお読みください。

lib123.soご覧のとおり、共有ライブラリを自分の共有ライブラリにリンクできますlibabc.so

次に、で確認しますldd libabc.so

リンク コマンドにandを追加して、いくつかのrpathを設定したい場合があります。libabc.so-Wl,-rpath-Wl,$RPATHDIR

詳細については、Drepper の論文How to write shared libraries を参照してください。

PS。静的ライブラリを使用しないlib123.aでください (PIC である必要があります)。非 PIC コードを共有オブジェクトにリンクすると、共有オブジェクトの利点のほとんどが失われ、動的リンカーld.soは無数の再配置を行う必要があります。

于 2013-10-17T10:47:22.793 に答える