Ho alcune librerie .so
che vorrei combinare in una libreria condivisa in modo che non dipenda più dai file originali .so
.Come combinare le librerie condivise?
I file .so
hanno dipendenze l'uno dall'altro.
Come posso fare questo? Posso farlo?
Ho alcune librerie .so
che vorrei combinare in una libreria condivisa in modo che non dipenda più dai file originali .so
.Come combinare le librerie condivise?
I file .so
hanno dipendenze l'uno dall'altro.
Come posso fare questo? Posso farlo?
Questo presuppone che il codice sorgente per tutti gli oggetti condivisi:
condizione che non vi siano conflitti di spazio nome (che non ci dovrebbe essere, se i due co-esistere così com'è), sarebbe non essere troppo terribilmente difficile da costruirli in un unico oggetto condiviso.
Se le stesse librerie condivise dipendono dal codice di un'altra libreria, l'ordine avrà importanza. Il vero lavoro consiste nel far funzionare le dipendenze nel makefile. Non ho mai visto dipendenze circolari nel link di SO con successo, quindi dubito che tu abbia loro per cominciare. Cioè foo() dipende da bar() che dipende da foo().
L'ho fatto più volte, anche se le librerie erano banali. Ho preso parti da ustr (gestore di stringhe), un gestore di file di configurazione, alcuni altri parser personalizzati e altre funzioni di utilità e creato un mash up personalizzato.
Il vero dolore sta apportando miglioramenti a monte a ciascuno una volta che li hai combinati, tuttavia non sono sicuro che sia un problema per te.
Quindi, se si dispone di:
libfoo.so: $(LIB_FOO_OBJECTS) $(LIB_BAR_OBJECTS) $(LIBFOOBAR_OBJECTS)
Dove:
LIB_FOO_OBJECTS = \
$(libfoo)/foo.o \
$(libfoo)/strings.o
LIB_BAR_OBJECTS = \
$(libbar)/bar.o
....
... e l'ordine è corretto .. il resto è abbastanza facile. Nota: non ho mostrato i deps di intestazione, tutti lo fanno in modo un po 'diverso. Sono importanti quando si creano mash-up, poiché probabilmente si vorrebbe evitare di ricompilare l'intera libreria ogni volta che cambia un'intestazione.
NB: se tutti e tre i progetti stanno usando autotools .. il vostro compito appena ricevuto esponenzialmente più facile (o difficile) a seconda.
Se non si dispone del codice sorgente
Se c'è una versione statica di ogni libreria, si può essere in grado di estrarre gli oggetti e li usa. I.e .:
$ cp /usr/lib/foo.a ./foo.a
$ ar x foo.a
$ gcc -fPIC -shared *.o -o foo.so
Ovviamente è un po 'più complicato di quanto illustrato.
Non l'ho mai provato e non so come gestire SOs che hanno main() quando si tratta di collegamento in quel caso.
Quello che vuole è "libstuff.so: libfoo.so libbar.so", non lo è? Penso che il problema è che non ha i file oggetto. –
@Jamie Soriano: La cosa migliore da fare (in tutti i conti) è compilare gli oggetti che rendono i singoli oggetti condivisi in un unico grande oggetto condiviso.Se crei solo un SO grande che dipende dal resto, non hai fatto nulla per risolvere il problema delle dipendenze che ti ha costretto a farlo in primo luogo. –
@Jaime Soriano: Questo è quello che volevo davvero. Ma non ero nemmeno sicuro che fosse possibile. –
Questo sembra essere correlato: http://stackoverflow.com/questions/386579/pack-shared-libraries-into-theelf. – Inshallah
@Inshallah: Windows - che devo supportare - non supporta ELF. –