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