2010-03-03 4 views
5

Lassen Sie mich das Szenario erklären. Wir haben eine ältere C++ kompilierte .so Bibliothek. Die Funktionen in dieser Bibliothek sind mit extern "c" {} deklariert, so dass die Bibliothek sowohl von C- als auch von C++ - Programmen verwendet werden kann, und aus irgendeinem Grund wurde sie mit der Option --static-libgcc erstellt.Wie schreibt man die .so Bibliothek, um existierende C++ .so Bibliothek zu ersetzen?

Diese alte Bibliothek ist sehr alt und schwer zu pflegen. Jetzt hatten wir es geschafft, eine Substitution davon zu schreiben, aber in C-Sprache. Nehmen wir an, die alte Bibliothek heißt libfoo.so (alt) und die neue libfoo.so (neu). Für eine gegebene bar.o kann sie entweder mit alten oder neuen libfoo.so verknüpft werden, um eine ausführbare Datei, zB bar.exe, zu erstellen. Aber die bar.exe kann nur mit der gleichen .so-Bibliothek laufen, die sie vorher verlinkt hat, mit anderen Worten, diese beiden Bibliotheken sind nicht gegenseitig austauschbar.

EDIT # 1: Ich habe eine symbolische Verknüpfung namens libfoo.so auf libfoo.so (alt) oder libfoo.so (neu) zeigen. Dieser symbolische Link libfoo.so befindet sich zur Laufzeit in LD_LIBRARY_PATH.

EDIT # 2: Wenn ich mit alten libfoo.so und erzeugt bar.exe verknüpft bar.o, wenn ich diese bar.exe mit neuen libfoo.so laufen, berichtet Fehler von undefined symbols. Durch nm diese beiden libfoo.so, kann ich diese Symbole in alten, aber nicht in neuen herausfinden. Die Symbole sind so etwas wie _ZSt4cerr, was ein C++ lib Mangled Name ist (ich dachte, es wurde von --static-libgcc gebracht), und natürlich enthält das neue libfoo.so diese Art von Symbolen nicht.

EDIT # 3: Wenn ich nur den C-Code mit g ++ anstelle von gcc kompiliere und verknüpfe, macht es irgendeinen Sinn?

Wie soll ich das umsetzen?

EDIT # 4: Heute habe ich geschafft/kompilieren verknüpfen die neue C programmierter libfoo mit g ++ (mit statischen libgcc, statische libstdC++), kann dies für alle C++ Symbole führen in libfoo.so enthalten sein. Das kann alles reibungslos laufen lassen, aber nicht das, was ich wirklich will.

+0

Warum läuft es nicht mit der neuen Bibliothek? Welche Art von Fehlermeldung erhalten Sie? –

+0

Er erhält keine Fehlermeldung. Er repariert etwas, das nicht kaputt ist, klirrt nur laut. –

+0

Bitte beachten Sie EDIT # 2, ich habe meine Frage aktualisiert. Vielen Dank! – solotim

Antwort

0

geben Sie denselben Namen und in verschiedene Verzeichnisse. benutze LD_LIBRARY_PATH env. Variable, um das Verzeichnis mit der gewünschten Bibliothek vor anderen Verzeichnissen zu setzen.

2

Wenn Sie das neue bauen und verknüpfen, können Sie es mit dem alten verknüpfen? Es klingt, als hätten Sie eine binärkompatible Bibliothek erstellt, aber nur in einer Richtung.

+0

Ja. Wenn ich die neue Bibliothek baue und verlinke, kann die erzeugte bar.exe mit alter und neuer Bibliothek laufen. Aber warum? – solotim

+0

Das bedeutet, dass die Header-Dateien der neuen Bibliothek von weniger Symbolen als denen der alten Bibliothek abhängig sind. http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html könnte einen besseren Einblick in was und wie von binärkompatiblen, gemeinsam genutzten Bibliotheken geben. – Jan

1

Edit # 2 hilft.

Im Grunde versucht Ihr bar.exe versucht, die C++ - Laufzeit Initialisierung für diese Bibliothek zu tun.

Sie müssen mindestens leere Implementierungen von identisch verkrüppelten Namen bereitstellen, damit die bar.exe Ihre .so dynamisch suchen und finden/aufrufen kann.

Wenn Sie weniger Glück haben, müssen Sie möglicherweise diese Funktionen tatsächlich etwas Sinnvolles tun, dass der Up-Level-Code als Erfolg interpretiert.

Viel Glück

+0

Oder, einfachere Antwort, C .so C++ zu ersetzen .so ist nicht praktisch ...? :( – solotim

Verwandte Themen