2013-10-17 19 views
15

Sto provando a creare una libreria condivisa. Diciamo libabc.so. Usa un altro file .so, diciamo lib123.so (una lib di/usr/local/lib). Ora sto usando il mio lib libccso condiviso nella mia applicazione. dì my-app. Voglio sapere come dovrei collegare questi binari ?? non voglio collegare la mia app con lib123.so direttamente. la mia app deve essere collegata solo con libabc.so. Come posso fare questo?Collegamento di una libreria condivisa con un'altra lib condivisa in linux

Grazie in anticipo. Sto usando il compilatore g ++

+0

hai pensato di usare un sistema di costruzione atuomato, per r esempio autotools? autotools viene fornito con libtool, che prende la maggior parte dell'elaborazione scomoda necessaria per costruire le librerie condivise. –

+0

@nyarlathotep: si ha torto nel consigliare il collegamento con un 'lib122.a' statico' libabc.so' condiviso –

+0

Mostra i comandi di compilazione esatti (per i file oggetto e la libreria condivisa). –

risposta

16

supporre che libabc.so è ottenuto da posiition independent file di codice oggetto abc1.pic.o e abc2.pic.o; quindi li hai creati 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 si costruisce libabc.so con

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

ho aggiunto -L/usr/local/libprima-l123 perché io parto dal presupposto di avere una libreria condivisa /usr/local/lib/lib123.so.

Leggi anche lo Program Library HowTo.

Come si vede, si può collegare una libreria condivisa lib123.so nella propria libreria condivisa libabc.so

Poi verificare con ldd libabc.so

PS. Non utilizzare una libreria statica per lib123.a (dovrebbe essere PIC). Se si collega il codice non PIC a un oggetto condiviso, si perde la maggior parte dei vantaggi degli oggetti condivisi e il linker dinamico ld.so deve eseguire miliardi di riposizionamenti.

+1

Ho fatto esattamente la stessa cosa che hai menzionato qui. Ma quando faccio un ldd su libabc.so, non sto elencando lib123.so. Sai perché è così? –

+0

Perché non una libreria statica per lib123? Cosa succede se non è PIC? –

+1

Non posso aiutarti, a meno che tu ** mostri ** almeno i ** comandi precisi ** coinvolti nella creazione degli oggetti 'abc * .pic.o' e della libreria' libabc.so'. –

1

Quando si cerca di creare la mia propria libreria condivisa che utilizza Berkeley DB, ho scoperto che devo mettere la -ldb alla fine del comando gcc altrimenti fatto saltare in aria dicendo che il simbolo 'DB_Create' non è stato trovato. Questo era sotto Cygwin.

In particolare, questo ha funzionato:

gcc -shared -o $ b/$ libfile nt _ * o -ldb

questo non ha funzionato:.

gcc - ldb -shared -o $ b/$ libfile nt _ *. o

Problemi correlati