2009-11-19 11 views
6

Ich habe einige .so Bibliotheken, die ich in einer gemeinsamen Bibliothek kombinieren möchte, so dass es nicht mehr auf die ursprünglichen .so Dateien abhängt.Wie kombiniere ich Bibliotheken?

Die .so Dateien haben Abhängigkeiten zueinander.

Wie kann ich das tun? Darf ich das machen?

+0

Dies scheint verwandt zu sein: http://stackoverflow.com/questions/386579/pack-shared-libraries-into-the-elf – Inshallah

+1

@Inshallah: Windows - die ich unterstützen muss - unterstützt ELF nicht. –

Antwort

8

Dies setzt voraus, Sie den Quellcode auf alle freigegebenen Objekte haben:

Vorausgesetzt, es gibt keine Namensraum Konflikte (die dort nicht sein sollte, wenn die beiden nebeneinander existieren, wie es ist), wäre es nicht zu schrecklich schwer, um sie zu einem gemeinsamen Objekt zusammenzufügen.

Wenn die gemeinsam genutzten Bibliotheken selbst von Code aus einer anderen Bibliothek abhängig sind, spielt die Reihenfolge eine Rolle. Die eigentliche Arbeit besteht darin, die Abhängigkeiten nur im Makefile auszuarbeiten. Ich habe noch nie gesehen, dass zirkuläre Abhängigkeiten in SO erfolgreich verlinkt sind, also bezweifle ich, dass Sie sie haben, um damit zu beginnen. I.e. foo() hängt von bar() ab, was von foo() abhängt.

Ich habe das schon mehrmals gemacht, obwohl die Bibliotheken selbst trivial waren. Ich habe Teile von ustr (string handler), einen Konfigurationsdatei-Handler, einige andere benutzerdefinierte Parser und andere Utility-Funktionen verwendet und einen benutzerdefinierten Mash-up erstellt.

Der wahre Schmerz bringt Upstream-Verbesserungen zu jedem, sobald Sie sie kombiniert haben, aber ich bin mir nicht sicher, ob das ein Problem für Sie ist.

Also, wenn Sie haben:

libfoo.so: $(LIB_FOO_OBJECTS) $(LIB_BAR_OBJECTS) $(LIBFOOBAR_OBJECTS) 

Wo:

LIB_FOO_OBJECTS = \ 
    $(libfoo)/foo.o \ 
    $(libfoo)/strings.o 

LIB_BAR_OBJECTS = \ 
    $(libbar)/bar.o 
.... 

... und die Reihenfolge richtig ist .. der Rest ist ziemlich einfach. Hinweis: Ich habe keine Header-Deps angezeigt, jeder macht das ein bisschen anders. Sie sind jedoch wichtig, wenn Sie Mash-ups erstellen, da Sie wahrscheinlich nicht jedes Mal, wenn sich ein Header ändert, die gesamte Bibliothek neu kompilieren möchten.

Hinweis: Wenn alle drei Projekte Autotools verwenden, ist Ihre Aufgabe je nachdem exponentiell einfacher (oder härter).

Wenn Sie den Quellcode NICHT haben

Wenn es eine statische Version von jeder Bibliothek ist, können Sie in der Lage sein, die Objekte zu extrahieren und sie verwenden. Ie .:

Natürlich ist es ein bisschen mehr beteiligt als illustriert.

Ich habe das noch nie probiert und weiß nicht, wie man mit SOs umgehen soll, die main() haben, wenn es in diesem Fall zum Verknüpfen kommt.

+0

Was er will, ist "libstuff.so: libfoo.so libbar.so", ist es nicht? Ich denke, dass das Problem ist, dass er die Objektdateien nicht hat. –

+0

@Jamie Soriano: Am besten (in allen Fällen) ist es, die Objekte zu kompilieren, die die einzelnen gemeinsamen Objekte zu einem großen gemeinsamen Objekt machen.Wenn Sie nur einen großen SO machen, der vom Rest abhängt, haben Sie nichts getan, um das Abhängigkeitsproblem zu lösen, das Sie dazu gebracht hat, es überhaupt zu tun. –

+0

@Jaime Soriano: Das wollte ich wirklich. Aber ich war mir nicht einmal sicher, ob das möglich war. –

Verwandte Themen