Wie zwei „ar“ statische Bibliotheken zu einem verschmelzen?
-
26-09-2019 - |
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.
Lösung
können Sie extrahieren das Objekt von beiden den .a
Dateien und erstellen Sie Ihre .a
Datei die extrahierten .o
s 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 verwendencreate 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"