Frage

Angenommen, ich habe drei C statische Bibliotheken sagen libColor.a die davon abhängt, * libRGB. * A, die wiederum hängt von libPixel.a . Die Bibliothek libColor.a sagte auf Bibliothek abhängen libRGB.a , da es einige Referenzen in sind libColor.a , um einige der Symbole in definierten libRGB.a . Wie kombiniere ich alle oben genannten Bibliotheken zu einem neuen libNewColor.a , die unabhängig ist?

Unabhängig bedeutet, dass die neue Bibliothek sollten alle Symbole definiert. Während also die Verknüpfung Ich muss nur geben -lNewColor . Die Größe der neuen Bibliothek sollte minimal sein d.h es keine Symbole in libRGB.a enthalten soll, die nicht von verwendet wird libColor.a usw. Ich versuchte mein Glück verschiedene Möglichkeiten in ar Befehl (zum Erstellen und Aktualisieren statische Bibliotheken / Archive) verwendet wird.

War es hilfreich?

Lösung

1 / Extrahieren Sie alle Objektdateien aus jeder Bibliothek (mit ar) und versuchen Sie den Code ohne den Bibliotheken oder einen der Objektdateien zu kompilieren. Sie werden wahrscheinlich eine absolute eimer Last undefinierter Symbole erhalten. Wenn Sie keine undefinierten Symbole zu erhalten, gehen Sie zu Schritt 5.

2 / Besorgen Sie sich die ersten und herauszufinden, welche Datei erfüllt das Objekt, das Symbol (mit nm).

3 / aufschreiben Objektdatei dann Ihren Code kompiliert, einschließlich der neuen Objektdatei. Sie werden eine neue Liste von undefinierten Symbolen erhalten oder, wenn es keine ist, gehen Sie zu Schritt 5.

4 / Gehen Sie zu Schritt 2.

5 / Kombinieren Sie alle Objektdateien in der Liste (falls vorhanden) in einer einzigen Bibliothek (wieder mit ar).

Bang! Hier hast du es. Versuchen Sie, verknüpfen Sie den Code, ohne dass die Objekte aber mit die neue Bibliothek.

Das Ganze relativ leicht mit einem Shell-Skript automatisiert werden kann.

Andere Tipps

Ein wenig gebrauchtes Merkmal des GNU Archivierungs ist der Archiv-Skript, es ist eine einfache, aber leistungsfähige Schnittstelle ist, und es kann genau das tun, was Sie wollen, zum Beispiel, wenn Sie das folgende Skript script.ar genannt wird:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
SAVE
END

Dann könnten Sie ar aufrufen wie folgt:

ar -M < script.ar

, und Sie würden libNewColor.a bekommen, dass alle die .o-Dateien von libColor.a libRGB.a und libPixel.a enthält.

Zusätzlich können Sie auch als auch mit dem ADDMOD Befehl regelmäßig .o-Dateien hinzufügen:

CREATE libNewColor.a
ADDLIB libColor.a
ADDLIB libRGB.a
ADDLIB libPixel.a
ADDMOD someRandomCompiledFile.o
SAVE
END

Darüber hinaus ist es super einfach diese Skripte in Makefiles zu erzeugen, so typischerweise erstelle ich eine etwas allgemeine Make-Datei Regel Archive für die Erstellung, die tatsächlich das Skript erzeugt und ruft ar auf dem Skript. So etwas wie folgt aus:

$(OUTARC): $(OBJECTS)
    $(SILENT)echo "CREATE $@" > $(ODIR)/$(ARSCRIPT)
    $(SILENT)for a in $(ARCHIVES); do (echo "ADDLIB $$a" >> $(ODIR)/$(ARSCRIPT)); done
    $(SILENT)echo "ADDMOD $(OBJECTS)" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "SAVE" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)echo "END" >> $(ODIR)/$(ARSCRIPT)
    $(SILENT)$(AR) -M < $(ODIR)/$(ARSCRIPT)

Obwohl jetzt, dass ich es sehe ich denke, es ist nicht, wenn $ funktioniert (Objekte) leer ist (dh, wenn Sie nur Archive wollen kombinieren, ohne zusätzliche Objektdateien), aber ich gehe es als eine Übung für den Leser dass Problem zu beheben, wenn nötig ...: D

Hier ist die Dokumentation für diese Funktion:

https://sourceware.org/binutils/docs/binutils/ar-scripts .html # ar-Skripte

Eine statische Bibliothek ist nicht viel mehr als ein Archiv von einigen Objektdateien (.o). Was können Sie tun, ist es, alle Objekte in den beiden Bibliotheken extrahieren (mit „ar x“) und verwenden Sie dann „ar“ sie zusammen in einer neuen Bibliothek zu verbinden.

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