Ich habe 2 statische Linux - Bibliotheken, erstellt von ar cr
, libabc.a
und libxyz.a
.
Ich möchte sie in einer statischen Bibliothek zusammenführen libaz.a
.
Wie kann ich das machen.
Ich möchte eine zusammengeführte statische Bibliothek erstellen und nicht beide Bibliotheken der endgültigen Verknüpfung von Anwendungen zuordnen.
linux
static-libraries
ar
osgx
quelle
quelle
libtool
-basierte Lösung :libtool -static -o new.a old1.a old2.a
Antworten:
Sie können das Objekt aus beiden
.a
Dateien.a
extrahieren und Ihre Datei mit den extrahierten.o
s erstellen :quelle
libabc.a
können Objekte enthalten die gleichen Namen (entstandene Form verschiedene Verzeichnisse) mit - wieder zusammenbauen dann nicht funktioniert!ar -c
hat bei mir nicht funktioniert (Ubuntu 14.04). Ich habear: no operation specified
. Ich habe esar -qc
stattdessen getan und das hat gut funktioniert.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 ebenfalls mit libtool erstellt haben, können Sie sie kombinieren, indem Sie die .la-Bibliotheken zu einer automake libaz_la_LIBADD-Variablen hinzufügen oder direkt aus einem Makefile mit folgenden Elementen:
Die anderen beiden sind zumindest bei Verwendung von GNU ar verfügbar. Sie können ein MRT-Skript (z. B. libaz.mri) verwenden, z.
und dann ar ausführen als:
Oder Sie können ein Thin- Archiv (Option
-T
) verwenden, mit dem Sie andere Archive hinzufügen können, ohne sie darin zu verschachteln. Der Nachteil ist jedoch, dass das getrennte Objekt fehlt, wenn Sie die statische Bibliothek verteilen möchten:Alle oben genannten Methoden behandeln überlappende Mitgliedsnamen aus den Originalarchiven ordnungsgemäß.
Andernfalls müssten Sie in verschiedene Verzeichnisse entpacken und erneut packen, um zu vermeiden, dass sich überlappende Mitgliedsnamen ersetzt werden:
quelle
ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M
. Dadurch wird ein temporäres Thin erstelltlibaz.a
und das Thin-Archiv wird dann in ein normales umgewandelt (sodass Sie es verschieben / verteilen können). Dies funktioniert auch ordnungsgemäß, wenn Ihre Bibliotheksnamen Sonderzeichen (Abstände, Pluszeichen oder Kommas) enthalten (dhar cqT libbundle.a libfoo++.a 'libbar baz.a'
). Aber +1 von mir!libtool
bekomme ich diese Fehler:libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag'
Irgendwelche Ideen, wie man das behebt?--Wl,-whole-archive
Option im ursprünglichen Verknüpfungsbefehl für mehrere lib * .a erforderlich, und ich brauche alle lib * .a in kombinierenone.a
. Funktioniert beim erneuten Verknüpfen--Wl,-whole-archive
nicht mitone.a
. Was ist dein Vorschlag? stackoverflow.com/questions/56323197/…Wenn Sie es einfach so machen:
Sie verlieren einige Objektdateien, wenn sich in aa und ba Mitglieder mit demselben Namen befinden. Daher müssen Sie Mitglieder verschiedener Archive in verschiedene Ordner extrahieren:
Darüber hinaus ist es möglich, dass sich in einem Archiv mehrere Mitglieder mit demselben Namen befinden (z. B. in aa). Wenn Sie ar x aa ausführen , erhalten Sie nur eines für Mitglieder mit demselben Namen.
Die einzige Möglichkeit, alle gleichnamigen Mitglieder in einem Archiv zu extrahieren, besteht darin, die Mitgliedsnummer mit der Option 'N' anzugeben:
Dies wäre eine mühsame Arbeit, daher müssen Sie ein ausgefeilteres Skript schreiben, um diesen Job zu erledigen.
Eine optionale Lösung besteht darin, dass Sie mehrere Archive in einer gemeinsam genutzten Bibliothek kombinieren können:
Auf diese Weise erledigt der Linker alle Dinge für Sie!
quelle
-fPIC
.Noch besser ist es, wenn Sie eine teilweise Verknüpfung für jede Bibliothek durchführen und diese ein Archiv der beiden resultierenden Objektdateien erstellen. Auf diese Weise funktioniert es wie gemeinsam genutzte Bibliotheken
Sie verknüpfen teilweise mit
Führen Sie das Programm entweder aus, anstatt es zu erstellen, oder nachdem Sie es erneut extrahiert haben
dann
quelle
Jetzt haben Sie zwei Versionen von "macroblock-10.o"
quelle
Hier erstellen Sie ein Archiv von Archiven und "reduzieren" das Ergebnis mit dem T-Flag. Ich bin mir nicht sicher, wie es mit .o-Dateien mit demselben Namen funktionieren soll, die möglicherweise darin enthalten sind.
quelle