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.
Warum läuft es nicht mit der neuen Bibliothek? Welche Art von Fehlermeldung erhalten Sie? –
Er erhält keine Fehlermeldung. Er repariert etwas, das nicht kaputt ist, klirrt nur laut. –
Bitte beachten Sie EDIT # 2, ich habe meine Frage aktualisiert. Vielen Dank! – solotim