2009-05-19 10 views
6

Pracuję nad redhat 5.2 nad projektem, który obejmuje kilka odmiennych organizacji. Każda organizacja dostarcza biblioteki, które zostały skompilowane z różnymi wersjami g ++. Obecnie wersje te obejmują wersje 4.1.1, 4.1.2 i 4.3.1. Próbuję połączyć wszystkie biblioteki razem do pliku wykonywalnego przy użyciu 4.1.2. Jakich, jeśli w ogóle, problemów mogę się spodziewać, robiąc to? Na marginesie, czy istnieje sposób na określenie, do której ABI kompiluje się każda wersja kompilatora?Mieszanie bibliotek z różnych kompilatorów C++

+0

Na początku myślałem, że masz na myśli Red Hat 5.2 (Apollo), który ma ponad dziesięć lat. :) – bk1e

Odpowiedz

1

Może łatwiej jest statycznego linku wykonywalnego ... robi wielką binarny, ale działa na wszystkich platformach.

6

Ten ABI dokument Polityka szczegóły kompatybilności pomiędzy różnymi wersjami ABI. Zgodnie z tym, biblioteka libstdc++.so powinna być kompatybilna, a po raz ostatni gcc złamał zgodność binarną na 3.4. Powinieneś być w porządku.

0

Nie powinno być żadnych problemów łączenie bibliotek zbudowanych z różnych wersji g ++, chyba że zostały one wymienione na stronie g ++. Ważne jest jednak, aby te biblioteki były zbudowane na tej samej platformie, która w twoim przypadku jest redhat 5.2. Biblioteka zbudowana dla platformy innej niż linux/redhat (np. Solaris) nie będzie łączyła się z twoim serwerem.

0

IIRC, istnieje biblioteka kompatybilności C++, która jest właśnie używana. Myślę, że to się nazywa libstdC++ - compat.

+0

Nie można łączyć obiektów, które zależą od różnych wersji stdlibC++. – ephemient

5

GCC (kolekcja kompilatorów GNU) określa numery wersji i kompatybilność.

Biblioteki G ++ między 4.1.1 a 4.1.2 powinny być kompatybilne; link z najnowszym.

Biblioteki G ++ między 4.1.x a 4.2.x nie są kompatybilne; musisz coś zrekompilować.

Biblioteki G ++ między 3.x.y a 4.p.q nie są kompatybilne; musisz coś zrekompilować.

W swoim scenariuszu kod zbudowany w wersji 4.3.1 nie jest zgodny z resztą.

Albo będziesz musiał przebudować kod obecnie skompilowany w 4.3.x, więc używa 4.1.x, albo musisz przekompilować kod obecnie skompilowany z 4.1.x, więc używa zamiast niego 4.3.x.

+0

Taka jest teoria, ale w praktyce ostatnia zmiana ABI była 3.4 –

+0

@Edu: ale w każdej chwili w przyszłości może nastąpić zmiana, która wywoła tę zasadę, a ludzie, którzy dostali niechlujstwa na temat rzeczy mogą być za niespodzianka (konieczność ponownej kompilacji). –

Powiązane problemy