GNU/Linux >> Belajar Linux >  >> Linux

Menautkan perpustakaan bersama dengan lib bersama lainnya di linux

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).


Linux
  1. C++ Dynamic Shared Library di Linux

  2. Kompilasi Pustaka Bersama Dinamis dengan g++

  3. menautkan <iostream.h> di linux menggunakan gcc

  1. Bagaimana cara membuat versi perpustakaan bersama di Linux?

  2. Apa arti dari Peringatan:Menautkan pustaka bersama dengan pustaka statis tidak portabel?

  3. Bagaimana cara menyalin folder dengan file ke folder lain di Unix/Linux?

  1. Perintah JQ di Linux dengan Contoh

  2. Pengantar Pustaka Bersama Linux (Cara Membuat Pustaka Bersama)

  3. Cara membuat penundaan perpustakaan bersama dimuat di Linux