Come unire due librerie statiche “ar” in una

Ho 2 librerie linux statiche, create da ar cr , libabc.a e libxyz.a .
Voglio unirli in una libreria statica libaz.a .
Come posso fare questo.

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

Puoi estrarre l’object da entrambi i file .a e creare il tuo file .a usando il file .o s estratto:

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

Ci sono almeno tre modi per farlo in modo nativo . Il primo e più portabile è usare libtool. Dopo aver costruito le altre librerie anche con libtool, puoi combinarle aggiungendo le librerie .la a 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 usa GNU ar. È ansible utilizzare uno script MRI (denominato ad esempio libaz.mri), ad esempio:

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

e quindi eseguire ar come:

 ar -M  

Oppure puoi usare un archivio sottile (opzione -T ), che ti permetterà di aggiungere altri archivi senza farli annidare all'interno, anche se lo svantaggio è che se vuoi distribuire la libreria statica, mancherà l'object staccato:

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

Tutti i metodi sopra descritti gestiscono con garbo i nomi dei membri sovrapposti dagli archivi originali.

Altrimenti, dovresti decomprimere in diverse directory e reimballare di nuovo, per evitare di sostituire i nomi dei membri sovrapposti:

 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 aa ar x ba ar c ca *.o 

si perderanno alcuni file object se ci sono membri con lo stesso nome sia in aa che in ba, quindi è necessario estrarre membri di archivi diversi in una cartella diversa:

 ar x aa && mv *.o a_objs ar x ba && mv *.o b_objs ar c ca a_objs/*.o b_objs/*.o 

inoltre, è ansible che ci siano più membri con lo stesso nome in un archivio (ad esempio in aa), se si esegue ar x aa , ne verrà visualizzato solo uno per i membri con lo stesso nome.

L’unico modo per estrarre tutti i membri con lo stesso nome in un archivio consiste nel specificare il numero membro con l’opzione ‘N’:

 ar xN 1 aa xxx.co && mv xxx.co xxx.c.1.o ar xN 2 ba xxx.co && mv xxx.co xxx.c.2.o ... 

questo sarebbe un lavoro noioso, quindi dovrai scrivere uno script più sofisticato per fare quel lavoro.

Una soluzione opzionale è la possibilità di combinare più archivi in ​​un’unica libreria condivisa:

 g++ -shared -o c.so -Wl,--whole-archive aa ba 

in questo modo il linker gestirà tutte le cose per te!