web-dev-qa-db-ja.com

Linuxでの共有ライブラリと別の共有ライブラリのリンク

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

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

18
A R

libabc.so位置に依存しない オブジェクトコードファイルabc1.pic.oおよびabc2.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共有ライブラリがあると想定しているため、-l123before/usr/local/lib/lib123.soを追加しました。

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

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

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

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

23

Berkeley DBを使用する独自の共有ライブラリを作成しようとすると、gccコマンドの最後に-ldbを配置する必要があることがわかりました。そうしないと、シンボル 'db_create'が見つからないというエラーが発生しました。これはCygwinの下にありました。

具体的には、これはうまくいきました:

gcc -shared -o $ b/$ libfile nt _ *。o -ldb

これは機能しませんでした:

gcc -ldb -shared -o $ b/$ libfile nt _ *。o

1
user2126571

Basile Starynkevitch によって指摘された同じ手順に従って、たとえば、libm.soに依存するライブラリがあるので、ライブラリオブジェクトのコンパイルは次のようになります。

gcc -fPIC -Wall -g -I include -I src -c src/wavegen.c  -o build/arm/wavegen.o                                                                                          
gcc -fPIC -Wall -g -I include -I src -c src/serial.c  -o build/arm/serial.o

ただし、ライブラリをコンパイルするには、gccの一部のバージョンでは、ライブラリ参照が配置される順序が重要であるため、互換性を確保するために、これらの参照をコマンドの最後に配置することをお勧めします。

gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm

PC(gcc v.8.3.0)とARM(gcc v.4.6.3))でテストしました。