GNU/Linux >> Linux Esercitazione >  >> Linux

Come unire due librerie statiche ar in una?

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

Linux
  1. Come unire 2 gruppi di volumi (VG) in uno usando vgmerge in LVM

  2. Unisci/converti più file PDF in un unico PDF

  3. Come unire due file usando AWK?

  4. come unire due file in modo coerente riga per riga

  5. Come dividere un file di testo in più file *.txt?

Come unire più righe in una in un file in Linux

Come unire più file PDF in un unico PDF in Linux

Come unire/unire più file audio in uno in Linux

Come dividere una partizione monolitica in due, una per `/` e una per `/home`??

Come fare eco in un file

Come unire più account cPanel in uno solo