GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie füge ich zwei statische Bibliotheken zu einer zusammen?

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

aus
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

Linux
  1. Umgang mit dynamischen und statischen Bibliotheken unter Linux

  2. Ist es möglich, mit Dh_installinit zwei Dienste für ein Paket zu installieren? Wie?

  3. Wie kann man mehrere Internetverbindungen zu einer zusammenführen?

  4. Wie konvertiere ich ein Video mit hoher Qualität in ein Video mit niedriger Qualität?

  5. wie man zwei Dateien konsistent Zeile für Zeile zusammenführt

So verbinden Sie mehrere Zeilen in einer Datei in Linux zu einer

So führen Sie unter Linux mehrere PDF-Dateien zu einem PDF zusammen

So verbinden/verschmelzen Sie mehrere Audiodateien zu einer in Linux

Wie teilt man eine monolithische Partition in zwei, eine für `/` und eine für `/home`??

Wie Echo in Datei

Wie füge ich mehrere cPanel-Konten zu einem zusammen?