GNU/Linux >> Linux の 問題 >  >> Linux

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

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

具体的には、これは機能しました:

<ブロック引用>

gcc -shared -o $b/$libfile nt_*.o -ldb

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

<ブロック引用>

gcc -ldb -shared -o $b/$libfile nt_*.o


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

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

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

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

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

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

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


たとえば、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) でテストしました。


Linux
  1. Linux 共有ライブラリの紹介 (共有ライブラリの作成方法)

  2. Linux 上の C++ 動的共有ライブラリ

  3. g++ を使用した動的共有ライブラリのコンパイル

  1. Linux in C で共有メモリを使用する方法

  2. ファイルを含むフォルダーを Unix/Linux の別のフォルダーにコピーするにはどうすればよいですか?

  3. Linux で共有ライブラリの遅延ロードを行う方法

  1. LinuxでのJQコマンドと例

  2. gcc の共有ライブラリ関数のスタティック リンク

  3. Linux で共有ライブラリを初期化する方法