共有ライブラリを構築しようとしています。 libabc.soとしましょう。別の.soファイル、たとえばlib123.so(/ usr/local/lib内のlib)を使用します。アプリケーションで共有ライブラリlibabc.soを使用しています。 my-appと言います。これらのバイナリをリンクする方法を知りたいですか? my-appはlibabc.soのみとリンクする必要があります。これどうやってするの?
前もって感謝します。私はg ++コンパイラを使用しています
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
共有ライブラリがあると想定しているため、-l123
before/usr/local/lib/lib123.so
を追加しました。
Program Library HowTo もお読みください。
ご覧のとおり、共有ライブラリlib123.so
を自分の共有ライブラリlibabc.so
にリンクできます。
次に、ldd libabc.so
で確認します
PS。 lib123.a
には静的ライブラリを使用しないでください(PICである必要があります)。非PICコードを共有オブジェクトにリンクすると、共有オブジェクトの利点のほとんどが失われ、動的リンカー ld.so は何十億もの再配置を行わなければなりません。
Berkeley DBを使用する独自の共有ライブラリを作成しようとすると、gccコマンドの最後に-ldbを配置する必要があることがわかりました。そうしないと、シンボル 'db_create'が見つからないというエラーが発生しました。これはCygwinの下にありました。
具体的には、これはうまくいきました:
gcc -shared -o $ b/$ libfile nt _ *。o -ldb
これは機能しませんでした:
gcc -ldb -shared -o $ b/$ libfile nt _ *。o
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))でテストしました。