2010-03-03 6 views
5

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ę.

+0

Dlaczego nie działa z nową biblioteką? Jakiego rodzaju komunikat o błędzie dostałeś? –

+0

Nie otrzymuje komunikatu o błędzie. Naprawia coś, co nie jest zepsute, po prostu głośno stuka. –

+0

Zobacz EDIT # 2, zaktualizowałem moje pytanie. Dzięki! – solotim

Odpowiedz

0

Podaj te same nazwy i umieść je w różnych katalogach. użyj LD_LIBRARY_PATH env. zmienna, aby ustawić katalog z żądaną biblioteką przed innymi katalogami.

2

Jeśli tworzysz i łączysz z nowym, czy możesz go połączyć ze starym? Wygląda na to, że wygenerowałeś bibliotekę kompatybilną z binariami, ale tylko w jednym kierunku.

+0

Tak. Jeśli zbuduję i połączę się z nową biblioteką, wyprodukowany plik bar.exe może działać ze starą i nową biblioteką. Ale dlaczego? – solotim

+0

Oznacza to, że pliki nagłówkowe nowej biblioteki zależą od symboli mniejszych niż w starej bibliotece. http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html może dostarczyć więcej informacji o tym, co i jak binarnie kompatybilnych bibliotek współdzielonych. – Jan

1

Edycja nr 2 pomaga.

Zasadniczo Twój bar.exe próbuje wykonać inicjowanie środowiska wykonawczego C++ dla tej biblioteki.

Trzeba będzie, co najmniej, dostarczenie puste implementacje nazw identycznie zniekształconych tak, że bar.exe mogą dynamicznie przeszukiwać .so i znaleźć/nich zadzwonić.

Jeśli masz mniej szczęścia, może być konieczne, aby te funkcje miały coś znaczącego, a kod wyższego poziomu interpretować jako sukces.

Powodzenia

+0

Lub, prostsza odpowiedź, C .to zastępując C++ .so nie jest praktyczne ...? :( – solotim