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!