2013-04-24 15 views
14

Mam kilka statycznych bibliotek, których nie jestem właścicielem, skompilowanych ze starą wersją g ++ (4.3.2, C++ 11/C++ 0x nie aktywowane).g ++ zawsze kompatybilny wstecz ze "starszymi" bibliotekami statycznymi?

Kiedy kompiluję mój kod za pomocą g ++ 4.6 (bez C++ 11) i łączę go (używając g ++ 4.6) z tymi bibliotekami statycznymi , to łączy się dobrze i nie wydaje mi się, że dostaję żadnych problemów w czasie wykonywania (nie testowałem wszystko jednak). , więc mam ochotę pomyśleć, że kompatybilność w przód jest w porządku.

Teraz chciałbym skompilować mój kod za pomocą gcc 4.8 z C++ 11 i nadal łączyć go z tymi samymi, nierekompilowanymi bibliotekami statycznymi. Czy nadal działa?

Innymi słowy, to zmiany ABI w g ++ tylko problem dla kompatybilności z linkiem do przodu czy też można uzyskać problemy ze zgodnością wsteczną?

Dzięki.

Odpowiedz

22

G ++ ABI dla kodu C++ 98 jest kompatybilny wstecz, aż z powrotem do GCC 3.4

Więc jeśli skompilować i połączyć swój ostateczny plik wykonywalny z GCC 4.8 można połączyć się do obiektów i bibliotek zbudowanych z niczego od GCC 3.4 do 4.8 (ale nie nowszego)

C++ 11 ABI jest taki sam jak C++ 98 ABI i standardowe typy bibliotek, które są wspólne dla C++ 98 i C++ 11 te same definicje, (ignorując GCC 4.7.0 i GCC 4.7.1, które miały niezgodności ABI w std::pair i std::list podczas korzystania z C++ 11, które zostały naprawione w wersji 4.7.2 i późniejszych), więc ca n związek C 98 i C++ ++ 11 kodu razem (chyba, że ​​kod C++ 11 zbudowano GCC 4.7.0 i 4.7.1)

Jednakże niektóre C++ 11 rodzaje bibliotek są nie jest jeszcze stabilny i zmienia się między wydaniami, np ponieważ zostały one najpierw wysłane przed ostatecznym standardem C++ 11 i musiały zostać zmienione, aby pasowały do ​​ostatecznych reguł. Więc niekoniecznie bezpiecznie jest mieszać kod C++ 11 zbudowany z GCC 4.6 i C++ 11 kod zbudowany z GCC 4.8

Dla twojego przypadku, gdzie cały kod C++ 11 jest zbudowany z GCC 4.8, który będzie OK. Jeśli uaktualnisz kompilator, powinieneś odbudować cały kod C++ 11 nowszym GCC, aby był bezpieczny. (Nie trzeba przebudowywać kodu C++ 98/C++ 03)

+0

Doskonałe dzięki! (Chciałbym przegłosować, ale nie pozwolono mi jeszcze na to wyglądać) –

+0

N.B. dwa ostatnie akapity, które właśnie dodałem, które powinienem był jasno określić na początku, ale był w pośpiechu, przepraszam –

+0

Dziękuję za dokładność, Jonathan (o rację, ** ** Johathan z ACCU 2013! Wyjaśnia jakość odpowiedzi :) –

0

Standardem C++ 11 jest utrzymanie zgodności wstecznej, podobnie jak producenci kompilatorów. Dopóki biblioteka nie używa niczego, co "łamie" standard C++ 11, sam format biblioteki powinien być taki sam.

Zobacz this dla zmian wprowadzonych w C++ 11.

Zakładając, że kod, którego używasz do wywoływania biblioteki (w tym nagłówków), powinieneś mieć się dobrze.

Powiązane problemy