GNU/Linux >> Linux Esercitazione >  >> Linux

Collegamento di una libreria condivisa con un'altra libreria condivisa in Linux

Quando ho provato a creare la mia libreria condivisa che utilizza Berkeley DB, ho scoperto che dovevo inserire -ldb alla fine del comando gcc altrimenti è esploso dicendo che il simbolo 'db_create' non è stato trovato. Questo era sotto Cygwin.

Nello specifico, questo ha funzionato:

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

Questo non ha funzionato:

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


Supponiamo che libabc.so è ottenuto dai file di codice oggetto indipendenti dalla posizione abc1.pic.o e abc2.pic.o; poi li hai costruiti con ad es.

 gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o
 gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o

e costruisci libabc.so con

gcc -shared  abc1.pic.o  abc2.pic.o -L/usr/local/lib -l123 -o libabc.so

Leggi anche il Program Library HowTo.

Come vedi, puoi collegare una libreria condivisa lib123.so nella tua libreria condivisa libabc.so

Quindi controlla con ldd libabc.so

Potresti voler impostare alcuni rpath nel tuo libabc.so aggiungendo -Wl,-rpath e -Wl,$RPATHDIR al comando di collegamento.

Per ulteriori dettagli, leggi l'articolo di Drepper Come scrivere librerie condivise

PS. Non usare una libreria statica per lib123.a (dovrebbe essere PIC). Se colleghi codice non PIC a un oggetto condiviso, perdi la maggior parte dei vantaggi degli oggetti condivisi e il linker dinamico ld.so deve eseguire milioni di trasferimenti.


Seguendo la stessa procedura indicata da Basile Starynkevitch, ad esempio, ho una libreria che dipende da libm.so , quindi la compilazione per gli oggetti della libreria è:

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

Per compilare la libreria, tuttavia, in alcune versioni di gcc l'ordine in cui vengono inseriti i riferimenti alla libreria è importante, quindi suggerisco, per garantire la compatibilità, di inserire tali riferimenti alla fine del comando:

gcc -shared -Wl,-soname,libserial.so.1 -o lib/libserial.so.1.0 build/arm/wavegen.o build/arm/serial.o -lm

Ho provato su PC (gcc v.8.3.0) e su ARM (gcc v.4.6.3).


Linux
  1. Libreria condivisa dinamica C++ su Linux

  2. Compilazione dinamica della libreria condivisa con g++

  3. Come inizializzare una libreria condivisa su Linux

  4. Come configurare googleTest come libreria condivisa su Linux

  5. Come posso copiare la cartella con i file in un'altra cartella in Unix/Linux?

Installa Linux con LVM

Sostituisci du con polvere su Linux

Comando wc Linux con esempi

Comando IP Linux con esempi

15 Comando Linux ps con esempi

Come fare in modo che un ritardo di libreria condivisa venga caricato su Linux