2016-12-30 2 views
0

Ich habe eine Bibliotheksdatei (.lib), wo es viele Funktionen gibt. Ich versuche ein gemeinsames Objekt daraus zu bauen. Aber keines der Symbole in der Bibliothek befindet sich in einem gemeinsamen Objekt, das sich in der Bibliothek befindet. Wenn ich ausführbare Dateien aus derselben Bibliothek erzeuge, sind die Symbole jedoch sichtbar.Symbole in .lib sind nicht in .so

Stimmt etwas mit Bibliotheken nicht? Muss ich Bibliotheken in einem Format kompilieren, das zum Erstellen eines gemeinsamen Objekts geeignet ist?

+0

Was genau ist das .lib-Datei? Ein Archiv oder eine gemeinsame Bibliothek oder etwas anderes? Geben Sie an, wie Sie es kompiliert haben und wie Sie Ihre gemeinsam genutzte Bibliothek und ausführbare Datei erstellen. –

+0

Es gibt eine Reihe von Make-Dateien, die ich bekommen habe. Ich benutze diese, um .lib (Archive) zu erstellen. Kannst du mir vorschlagen, wie man ein .so daraus macht? –

Antwort

0

Was Linker tun, ziehen sie nur die .o Dateien aus einem Archiv .a, die ein nicht aufgelöstes Symbol auflösen.

Wenn Sie eine gemeinsam genutzte Bibliothek verknüpfen und nur .a Dateien an den Linker übergeben, gibt es keine ungelösten Symbole, daher werden keine Objektdateien von .a in die gemeinsam genutzte Bibliothek gezogen.

eine gemeinsame Bibliothek verknüpfen die Objektdateien als Position unabhängigen Code kompiliert werden müssen (-fPIC, .o Dateien für .a werden in der Regel ohne diese Option eingebaut) und dann in eine gemeinsame Bibliothek verknüpft. Hierfür sind keine .a Dateien erforderlich.

Eine andere Option ist, wenn die Verknüpfung Dateien explizit die Symbole, die in .a mit -Wl,--undefined=<symbol> Linker-Option vorhanden sind, zu definieren. Dies ist jedoch nicht gut skalierbar, da es erforderlich ist, mindestens ein Symbol aus jedem .o zu nennen, das umfasst (unter der Annahme, dass der Linker ein ganzes .o statt nur eines Symbols einzieht).

Verwandte Themen