2009-06-04 3 views
15

Ich versuche, eine einzelne statische Bibliothek zu erstellen, die Objektdateien und vorhandene statische Bibliotheken enthält, die alle zuvor im Erstellungsprozess kompiliert wurden. Gibt es eine einfache Möglichkeit, dies mit "ar" zu tun, oder muss ich jede Bibliothek entpacken (ar x library_name) und ihre Objektdateien zu meiner vereinheitlichten Bibliothek hinzufügen?Verwenden von "AR" zum Kombinieren von .o und .a-Dateien (Linux)

+0

Mögliches Duplikat http: // stackoverflow.com/questions/386579/pack-shared-libraries-in-the-elf –

+0

Nein, kein Duplikat. Diese Frage bezieht sich auf den Versuch, eine Verbindung mit gemeinsam genutzten Bibliotheken herzustellen, während sich diese Frage auf statische Bibliotheken und Objekte bezieht, die noch nicht verknüpft sind. – ephemient

+0

Wenn Sie den Buildprozess steuern, scheint dieses Muster eine saubere Lösung zu sein: http://stackoverflow.com/a/4318960/78342 – Chinasaur

Antwort

0

Sie müssen die Objektdateien aus den anderen Bibliotheken extrahieren und die extrahierten Objektdateien in Ihrer Verbundbibliothek bündeln.

Sehen Sie sich auch inkrementelle Laden: ld -r

7

Wenn Sie eine gemeinsam genutzte Bibliothek erstellen möchten Sie diese verwenden können:

Sie können das --whole-Archiv Flagge von ld:

--whole-archive
Fügen Sie für jedes Archiv, das in der Befehlszeile nach der Option --whole-archive angegeben wird, jede Objektdatei in das Archiv ein die Verknüpfung, anstatt das Archiv nach den erforderlichen Objektdateien zu durchsuchen. Dies wird normalerweise verwendet, um eine Archivdatei in eine gemeinsam genutzte Bibliothek umzuwandeln, wobei jedes Objekt gezwungen wird, in der resultierenden gemeinsam genutzten Bibliothek enthalten zu sein. Diese Option kann mehrmals verwendet werden.

Zwei Hinweise bei Verwendung dieser Option von gcc: Erstens, GCC weiß nicht über diese Option, also müssen Sie -Wl, -whole-archive verwenden. Zweitens, vergessen Sie nicht, -Wl, -no-whole-archive nach Ihrer Liste von Archiven zu verwenden, da gcc eine eigene Liste von Archiven zu Ihrem Link hinzufügen wird und Sie nicht wollen, dass diese Markierung auch diese betrifft.

Bei statischen Bibliotheken müssen Sie möglicherweise zuerst die Objekte extrahieren.

fand ich folgende für ar

Gnu ar ein dünnes Archiv optional erstellen kann, die einen Symbolindex und Verweise auf die ursprünglichen Kopien der Teildateien des Archivs enthält. Ein solches Archiv ist nützlich zum Erstellen von Bibliotheken zur Verwendung innerhalb eines lokalen Builds, wobei erwartet wird, dass die verschiebbaren Objekte verfügbar bleiben, und das Kopieren des Inhalts jedes Objekts würde nur Zeit und Platz verschwenden. Dünne Archive werden ebenfalls abgeflacht, sodass das Hinzufügen eines oder mehrerer Archive zu einem Thin-Archiv die Elemente des verschachtelten Archivs einzeln hinzufügt. Die Pfade zu den Elementen des Archivs werden relativ zum Archiv selbst gespeichert.

Vielleicht können Sie ein solches dünnes Archiv verwenden.

+0

Die Thin-Archivierungsoption ist (relativ) neu. Es ist zum Beispiel nicht auf Fedora 8 verfügbar (ar 2.17.50). – neuro

+0

+1 übrigens für eine interessante Option (--whole-archive), die gerade mein Leben gerettet hat! – neuro

1

Archivierung der Archive ist immer möglich. Ich habe nicht getestet, ob es funktioniert, wenn die tatsächliche API von der Implementierung aufgerufen wird.

Ex: ar rc lib1.a obj1.o ar rc lib2.a obj2.o ar rc lib3.a lib1.a lib2.a

you can check the contents of lib3.a by trying out. 

    ar x lib3.a which would extract lib1.a and lib2.a 

Aber müssen Sie den Aufruf der API bauen von obj1.o und obj2.o. Dann müssen die Objektdateien nicht aus einzelnen Archiven extrahiert werden.

Hoffe es hilft!

Verwandte Themen