Ketika mencoba membuat perpustakaan bersama saya sendiri yang menggunakan Berkeley DB, saya menemukan bahwa saya harus meletakkan -ldb di akhir perintah gcc atau jika tidak, akan meledak dengan mengatakan simbol 'db_create' tidak ditemukan. Ini di bawah Cygwin.
Secara khusus, ini berhasil:
gcc -shared -o $b/$libfile nt_*.o -ldb
Ini tidak berhasil:
gcc -ldb -shared -o $b/$libfile nt_*.o
Misalkan libabc.so
diperoleh dari file kode objek independen posisi abc1.pic.o
dan abc2.pic.o
; maka Anda telah membuatnya dengan mis.
gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o
dan Anda membuat libabc.so
dengan
gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so
Baca juga Panduan Pustaka Program.
Seperti yang Anda lihat, Anda dapat menautkan pustaka bersama lib123.so
ke perpustakaan bersama Anda sendiri libabc.so
Kemudian periksa dengan ldd libabc.so
Anda mungkin ingin menyiapkan beberapa rpath di libabc.so
Anda dengan menambahkan -Wl,-rpath
dan -Wl,$RPATHDIR
ke perintah penautan.
Untuk detail lebih lanjut, baca makalah Drepper Cara menulis perpustakaan bersama
PS. Jangan gunakan perpustakaan statis untuk lib123.a
(harus PIC). Jika Anda menautkan kode non-PIC ke objek bersama, Anda kehilangan sebagian besar keuntungan dari objek bersama, dan linker dinamis ld.so harus melakukan jutaan relokasi.
Mengikuti prosedur yang sama yang ditunjukkan oleh Basile Starynkevitch, misalnya, saya memiliki perpustakaan yang bergantung pada libm.so
, jadi kompilasi untuk objek perpustakaan adalah:
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
Namun, untuk mengompilasi pustaka, dalam beberapa versi gcc, urutan tempat referensi pustaka ditempatkan, adalah penting, jadi saya sarankan, untuk memastikan kompatibilitas, tempatkan rujukan tersebut di akhir perintah:
gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm
Saya telah menguji di PC (gcc v.8.3.0) dan di ARM (gcc v.4.6.3).