Pozwól mi wyjaśnić scenariusz. Mamy starszą skompilowaną bibliotekę .so w C++. Funkcje w tej bibliotece są zadeklarowane za pomocą extern "c" {}
, więc biblioteka może być używana zarówno przez program C jak i C++, a ponadto z jakiegoś powodu została utworzona z opcją --static-libgcc
.Jak napisać bibliotekę .so, aby zastąpić istniejącą bibliotekę C++ .so?
Ta stara biblioteka jest bardzo stara i trudna do utrzymania. Teraz udało nam się napisać podsumowanie tego, ale w języku C. Załóżmy, że stara biblioteka nazywa się libfoo.so (stara), a nowa to libfoo.so (nowa). Dla danego pliku bar.o można go połączyć ze starym lub nowym libfoo.so, aby utworzyć plik wykonywalny, powiedzmy, bar.exe. Ale bar.exe może działać tylko z tą samą biblioteką .so, z którą wcześniej się łączył, innymi słowy, te dwie biblioteki nie są wzajemnie wymienialne.
EDIT # 1: zrobiłem dowiązanie symboliczne o nazwie libfoo.so aby wskazać libfoo.so (stary) lub libfoo.so (nowy). To dowiązanie symboliczne libfoo.so znajduje się w katalogu LD_LIBRARY_PATH w środowisku wykonawczym.
EDIT # 2: Kiedy podłączyłem bar.o ze starym libfoo.so i generowanego bar.exe, jeśli uruchomić ten bar.exe z nowym libfoo.so, że zgłaszane błąd undefined symbols
. Przez te dwie biblioteki libfoo.so mogę znaleźć te symbole w starym, ale nie w nowym. Symbole to coś w stylu _ZSt4cerr
, które jest myloną nazwą C++ lib (chociaż przyniósł ją --static-libgcc
) i oczywiście nowe libfoo.so nie zawiera tych symboli.
EDIT # 3: Jeśli po prostu skompiluję i połączę kod C z g ++ zamiast gcc, czy to ma sens?
Jak mam to wdrożyć?
EDIT # 4: Dzisiaj udało mi się skompilować/link nowa C programed libfoo z g ++ (ze statycznym libgcc, libstdC++ statyczna), może to prowadzić do wszystkich symboli C++ mają być zawarte w libfoo.so. Dzięki temu wszystko może przebiegać płynnie, ale nie to, czego naprawdę chcę.
Dlaczego nie działa z nową biblioteką? Jakiego rodzaju komunikat o błędzie dostałeś? –
Nie otrzymuje komunikatu o błędzie. Naprawia coś, co nie jest zepsute, po prostu głośno stuka. –
Zobacz EDIT # 2, zaktualizowałem moje pytanie. Dzięki! – solotim