Come unire due librerie statiche "ar" in una?
-
26-09-2019 - |
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.
Soluzione
È possibile estrarre l'oggetto da entrambi i file .a
e creare il file di .a
utilizzando i .o
s 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"