Domanda

Ho 2 librerie Linux statiche, create da ar cr, libabc.a E libxyz.a.
Voglio unirli in un'unica libreria statica libaz.a.
Come posso fare questo.

Voglio creare una libreria statica unita, non fornire entrambe le librerie al collegamento finale delle applicazioni.

È stato utile?

Soluzione

È possibile estrarre l'oggetto da entrambi i file .a e creare il file di .a utilizzando i .os estratti:

ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a  *.o

Altri suggerimenti

Ci sono almeno tre modi per fare questo nativamente . Il primo e più portatile modo è quello di utilizzare libtool. Dopo aver costruito le altre librerie anche con libtool, è possibile combinarli semplicemente aggiungendo le librerie .la ad una variabile libaz_la_LIBADD automake, o direttamente da un Makefile con qualcosa di simile:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

Gli altri due sono almeno disponibili quando si utilizza GNU ar. È possibile utilizzare uno script MRI (chiamato per esempio libaz.mri), come ad esempio:

create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

e quindi eseguire ar come:

ar -M <libaz.mri

In alternativa, è possibile utilizzare un sottile archivio (opzione -T), che consentirà di aggiungere altri archivi senza ottenere al loro interno nidificato, anche se il rovescio della medaglia è che se si desidera distribuire la libreria statica, il staccato oggetto mancherà:

ar -rcT libaz.a libabc.a libxyz.a

Tutti i metodi di cui sopra trattano con grazia sovrapposizione nomi dei membri dagli archivi originali.

In caso contrario, avrebbe dovuto disfare in diverse directory e repack di nuovo, al fine di evitare sovrapposizioni di sostituire i nomi dei membri:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

Se lo fai semplicemente come:

ar x a.a
ar x b.a
ar c c.a  *.o 

Perderai alcuni file di oggetti se ci sono membri con lo stesso nome sia in AA che in BA, quindi è necessario estrarre membri di diversi archivi in ​​una cartella diversa:

ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o

inoltre, è possibile che ci siano più membri con lo stesso nome in un archivio (diciamo in a.a), se esegui ar x a.a, ne otterrai solo uno per i membri con lo stesso nome.

L'unico modo per estrarre tutti i membri con lo stesso nome in un archivio è specificare il numero del membro tramite l'opzione 'N':

ar xN 1 a.a  xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a  xxx.c.o && mv xxx.c.o xxx.c.2.o
...

questo sarebbe un lavoro noioso, quindi dovrai scrivere una sceneggiatura più sofisticata per svolgere quel lavoro.

Uno opzionale soluzioni è che puoi combinare più archivi in ​​un'unica libreria condivisa:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

in questo modo il linker gestirà tutto per te!

Ancora meglio si esegue il collegamento parziale su ogni libreria e li rendono un archivio delle due file oggetto risultanti. In questo modo funziona come librerie condivise farebbe

Lo fai collegamento parziale

gcc -r --nostdlib

quindi o invece di fare l'archivio intermedio o dopo reextracting, eseguire

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

poi

ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a

Ora avete due versione di "macroblocco-10.o"

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top