Frage

Ich habe 2 statische Linux-Bibliotheken, erstellt von ar cr, libabc.a und libxyz.a.
Ich möchte, dass sie in eine statische Bibliothek libaz.a verschmelzen.
Wie kann ich dies tun.

Ich mag eine fusionierte statische Bibliothek erstellen, nicht beiden Bibliotheken Endglied von Anwendungen zu geben.

War es hilfreich?

Lösung

können Sie extrahieren das Objekt von beiden den .a Dateien und erstellen Sie Ihre .a Datei die extrahierten .os mit:

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

Andere Tipps

Es gibt mindestens drei Möglichkeiten, dies zu tun nativ . Die erste und tragbare Art und Weise ist libtool zu verwenden. Nachdem ich die anderen Bibliotheken mit libtool auch gebaut zu haben, können Sie sie kombinieren nur die .la Libs, indem zu einer auto libaz_la_LIBADD Variable oder direkt von einem Makefile mit so etwas wie:

libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la

Die anderen beiden sind zumindest zur Verfügung, wenn GNU ar verwenden.

: Sie können einen MRI-Skript (mit dem Namen zum Beispiel libaz.mri), wie verwenden
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end

und führen Sie dann ar wie:

ar -M <libaz.mri

Sie können auch eine dünn verwenden Archiv (Option -T), die anderen Archiven hinzugefügt werden können, ohne sie verschachtelte innen zu bekommen, obwohl der Nachteil, dass, wenn Sie die statische Bibliothek verteilen möchten, das abgelöste Objekt fehlen wird:

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

Alle oben genannten Methoden behandeln anmutig überlappende Elementnamen von den ursprünglichen Archiven.

Ansonsten müßten Sie in verschiedene Verzeichnisse entpacken und repack wieder ersetzen zu vermeiden Mitgliedernamen überlappende:

mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz

Wenn Sie einfach tun es als:

ar x a.a
ar x b.a
ar c c.a  *.o 

finden Sie einige Objektdateien verloren, wenn es Mitglieder mit dem gleichen Namen in beiden a.a und B. A. so müssen Sie extrahieren die Mitglieder der verschiedenen Archiven in verschiedene Ordner:

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

weiter mehr, ist es posible, dass es mehrere Mitglieder des gleichen Namens in einem Archiv (sagen in aa), wenn Sie laufen ar x aa , werden Sie nur ein für die Mitglieder der gleichen erhalten Name.

Die einzige Möglichkeit, alle Mitglieder gleichen Namen in einem Archiv zu extrahieren, ist es, die Mitgliedsnummer durch die Option ‚N‘ angeben:

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
...

dies eine mühsame Arbeit sein würde, so dass Sie eine verfeinerte Skript schreiben, muss diese Arbeit zu tun.

Ein optional Lösungen ist, dass Sie mehrere Archive in eine gemeinsame Bibliothek kombinieren:

g++ -shared -o c.so -Wl,--whole-archive a.a b.a 

auf diese Weise der Linker alle Dinge für Sie erledigen!

Noch besser führen Sie Teil-Verknüpfung auf jeder Bibliothek und sie machen ein Archiv der beiden resultierenden Objektdateien. Auf diese Weise es funktioniert wie Shared Libraries würde

Sie tun partielle Verknüpfung mit

gcc -r --nostdlib

so entweder anstatt das Zwischen Archiv oder nach Reextraktion es, führen

gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o

dann

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

Jetzt haben Sie zwei Version von "Makroblock-10.o"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top