Ci sono almeno tre modi per farlo nativamente . Il primo e più portabile modo è usare libtool. Dopo aver costruito le altre librerie anche con libtool, puoi combinarle semplicemente aggiungendo le librerie .la a una variabile automake libaz_la_LIBADD, o direttamente da un Makefile con qualcosa del tipo:
libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
Gli altri due sono almeno disponibili quando si usa GNU ar. È possibile utilizzare uno script MRI (denominato ad esempio libaz.mri), come:
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end
e poi esegui ar as:
ar -M <libaz.mri
Oppure puoi usare un sottile archivio (opzione -T
), che consentirà di aggiungere altri archivi senza inserirli all'interno, anche se lo svantaggio è che se si desidera distribuire la libreria statica, mancherà l'oggetto separato:
ar -rcT libaz.a libabc.a libxyz.a
Tutti i metodi di cui sopra 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 che si sovrappongono:
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 oggetto se ci sono membri con lo stesso nome sia in a.a che in b.aso, devi estrarre membri di archivi diversi in cartelle diverse:
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 riceverai solo uno per quei 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 con 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 fare quel lavoro.
Uno facoltativo solutions è che puoi combinare più archivi in una libreria condivisa:
g++ -shared -o c.so -Wl,--whole-archive a.a b.a
in questo modo il linker gestirà tutto per te!
Puoi estrarre l'oggetto sia da .a
file e crea il tuo .a
utilizzando il .o
estratto s:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
Ancora meglio si esegue un collegamento parziale su ciascuna libreria e si crea un archivio dei due file oggetto risultanti. In questo modo funziona come farebbero le librerie condivise
Fai un collegamento parziale con
gcc -r --nostdlib
quindi, invece di creare l'archivio intermedio o dopo averlo riestratto, esegui
gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o
allora
ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o