2009-05-27 4 views
28

Sagen, ich habe a.so und b.so. Kann ich c.so als eine einzige gemeinsame Bibliothek mit allen von a und b exportierten Funktionen erstellen, natürlich alle Intra-Abhängigkeiten auflösen (d. H. Alle Funktionen von b.so, die von a.so aufgerufen werden und umgekehrt)?Merge mehrere .so freigegebenen Bibliotheken

Ich versuchte

gcc -shared -Wl,soname,c.so -o c.so a.so b.so

aber es funktioniert nicht.

Das Gleiche gilt, wenn ich a.o und b.o in a.a und B. A archivieren (die a.o und b.o nicht ändern sollte), und tun

gcc -shared -Wl,soname,c.so -o c.so a.a b.a

Dank

+0

Am Ende habe ich mit einer GROUP Bibliothek Skript verwenden zurückgegriffen, die mir all die kleinen Bibliotheken als eine einzige zeigen erlaubt, aber Eine Software könnte einfach mit der rechten "Unter" -Bibliothek verlinken. – Metiu

Antwort

38

Das Zusammenführen mehrerer gemeinsamer Bibliotheken zu einem ist in der Tat praktisch unmöglich auf allen UNIXen, außer AIX: Der Linker betrachtet das .so als "endgültiges" Produkt.

Aber verschmelzenden Archive in .so sollte kein Problem sein:

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive 
+0

Danke für die nützliche Flagge: whole-archive! –

+0

Ist die Reihenfolge der Archive hier wichtig? Wenn ich einige .a-Dateien habe, kann ich * .a verwenden? – Raj

+1

@Raj Nein, die Reihenfolge spielt keine Rolle - sie alle werden in ihrer Gesamtheit enthalten sein. Wenn Sie in Ihrem '* .a' keine Symbolneudefinitionen haben, funktioniert' * .a' einfach (TM). –

7

In der Praxis ist es nicht möglich.

Aus Sicht des Linkers ist eine SO-Bibliothek ein endgültiges Produkt, das keine zum Verknüpfen erforderliche Umlagerungsinformation enthält.

Wenn Sie Zugriff auf Quell- oder Objektdateien für beide Bibliotheken haben, ist es einfach, ein kombiniertes SO von ihnen zu kompilieren/zu verknüpfen.

+1

"Wenn Sie Zugriff auf Quell- oder Objektdateien für beide Bibliotheken haben, ist es einfach, ein kombiniertes SO von ihnen zu kompilieren/zu verknüpfen." --- Wie mache ich das ? Insbesondere auf Android-Plattform. –