Es gibt mindestens drei Möglichkeiten, dies nativ zu tun . Der erste und portabelste Weg ist die Verwendung von libtool. Nachdem Sie die anderen Bibliotheken auch mit libtool erstellt haben, können Sie sie kombinieren, indem Sie einfach die .la-Bibliotheken zu einer automake-libaz_la_LIBADD-Variablen hinzufügen oder direkt aus einem Makefile mit etwas wie:
libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
Die anderen beiden sind zumindest verfügbar, wenn GNU ar verwendet wird. Sie können ein MRI-Skript verwenden (z. B. mit dem Namen libaz.mri), wie zum Beispiel:
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end
und führen Sie dann ar aus als:
ar -M <libaz.mri
Oder Sie können ein dünnes verwenden Archiv (Option -T
), was das Hinzufügen anderer Archive ermöglicht, ohne dass sie darin verschachtelt werden, obwohl der Nachteil darin besteht, dass das getrennte Objekt fehlt, wenn Sie die statische Bibliothek verteilen möchten:
ar -rcT libaz.a libabc.a libxyz.a
Alle oben genannten Methoden handhaben problemlos sich überschneidende Mitgliedsnamen aus den Originalarchiven.
Andernfalls müssten Sie in verschiedene Verzeichnisse entpacken und wieder neu packen, um zu vermeiden, dass sich überschneidende Elementnamen ersetzt werden:
mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz
Wenn Sie es einfach so machen:
ar x a.a
ar x b.a
ar c c.a *.o
Sie werden einige Objektdateien verlieren, wenn es Mitglieder mit demselben Namen sowohl in a.a als auch in b.aso gibt, Sie müssen Mitglieder verschiedener Archive in verschiedene Ordner extrahieren:
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
außerdem ist es möglich, dass es mehrere Mitglieder mit demselben Namen in einem Archiv gibt (z. B. in a.a), wenn Sie ar x a.a ausführen , erhalten Sie nur eine für Mitglieder mit demselben Namen.
Die einzige Möglichkeit, alle Mitglieder mit demselben Namen in einem Archiv zu extrahieren, besteht darin, die Mitgliedsnummer mit der Option 'N' anzugeben:
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 wäre eine mühsame Arbeit, daher müssen Sie ein ausgefeilteres Skript schreiben, um diese Aufgabe zu erledigen.
Eine optional Lösungen besteht darin, dass Sie mehrere Archive in einer gemeinsam genutzten Bibliothek kombinieren können:
g++ -shared -o c.so -Wl,--whole-archive a.a b.a
Auf diese Weise erledigt der Linker alle Dinge für Sie!
Sie können das Objekt sowohl aus .a
extrahieren Dateien und erstellen Sie Ihre .a
Datei mit dem extrahierten .o
s:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
Noch besser, Sie führen eine teilweise Verknüpfung für jede Bibliothek durch und erstellen ein Archiv der beiden resultierenden Objektdateien. Auf diese Weise funktioniert es wie Shared Libraries
Teilweise verlinken Sie mit
gcc -r --nostdlib
Anstatt also das Zwischenarchiv zu erstellen oder es nach dem Extrahieren erneut zu extrahieren, führen Sie
ausgcc -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