2011-01-16 14 views
8

Obecnie piszę do biblioteki i rozważam przejście z GCC 4.1.2 do 4.5.2 (najnowsza wersja) GCC. Jeśli skompiluję mój kod do biblioteki statycznej, czy mogę założyć, że zgodność kompilatora (w tym samym systemie operacyjnym oczywiście) nie powinna być problemem dla klientów?Kompatybilność biblioteki w języku C++

EDIT do dalszego wyjaśnienia: czy mogę dostarczyć klientowi statycznie połączone biblioteki skompilowane z gcc 4.5.2, jakie ograniczenia ma to miejsce na użytkowników tej biblioteki pod względem wersji kompilatora i muszą używać?

+0

Jeśli dobrze zrozumiałem twoje pytanie ... potem tak. – Arunmu

+0

Wyjaśniłem moje pytanie, zobacz Edycja. – Graeme

Odpowiedz

7

Właśnie natknąłem się ten, który wierzę odpowiedzi na moje pytanie z http://gcc.gnu.org/bugs/#nonbugs:

ABI zmienia C++ aplikacja binarna interfejsu (ABI) składa się z dwóch elementów: pierwszy określa, w jaki sposób elementy zajęć są określonymi funkcjami, jak nazywają się nazwy funkcji, itp.; druga część zawiera część wewnętrzną obiektów w bibliotece libstdC++. Chociaż my dążymy do niezmiennego ABI, do tej pory musieliśmy zmodyfikować to z każdym głównym wydaniem . Jeśli zmienisz kompilator na inną wersję główną , musisz przekompilować wszystkie biblioteki, które zawierają kod C++. Jeśli tego nie zrobisz, ryzykujesz, że błędy linkera lub nieprawidłowe działanie programów będą nieprawidłowe. Niektóre z naszych bibliotek pomocniczych Java zawierają również kod C++ , więc możesz chcieć rekompilować wszystkie biblioteki, aby były bezpieczne. To nie powinno być konieczne do ponownej kompilacji , jeśli zmieniono wersję błędu na wydania tej samej wersji kompilatora ; Poprawki błędów są ostrożne , aby uniknąć zmian ABI. Zobacz także rozdział dotyczący kompatybilności w podręczniku GCC .

Uwaga: główny uwalniania oznaczono przez zmiany w pierwszej albo drugiej składowej liczby wersji dwu- lub trzyczęściowego. Niewielkie (poprawianie błędów) wydanie jest oznaczone jako zmiana na tylko na trzeci komponent. Zatem GCC 3.2 i 3.3 są głównymi wersjami, a 3.3.1 i 3.3.2 są wydaniami poprawek błędów dla GCC 3.3. W serii 3.4 my wprowadzamy nowy schemat nazewnictwa; Pierwsza wersja tej serii to 3.4.0 zamiast tylko 3,4.

Z tego, jak rozumiem, będę musiał upewnić się, że klienci łączą moją bibliotekę ze zgodną wersją gcc.

1

Nie ma znaczenia, czy udostępniasz statyczną bibliotekę lub dynamiczną bibliotekę, użytkownicy nadal będą musieli używać kompatybilnego kompilatora/linkera, aby połączyć się z nim. Zwykle, gdy GCC dokonuje zmiany ABI, oferują przełącznik, który można ustawić tak, aby korzystał ze starego ABI. Wiem, że zrobili to, kiedy przeszli od wersji 3.x do 4.x, a nawet kilku wydań z serii 4.x.