2014-11-16 16 views
7

W przypadku gdy, powiedzmy, twój projekt jest zbudowany z jedną wersją kompilatora C++, a jego potencjalny system docelowy udostępnia biblioteki współdzielone zbudowane z inną wersją, jak to się często robi? W szczególności jest to pytanie o libstdC++.Jaki jest typowy sposób radzenia sobie z zależnościami bibliotek podczas budowania z kompilatorami innymi niż docelowe?

Gdy coś jest budowane w ramach tej samej dystrybucji (na przykład na Linuksie itp.), Jest to dość proste - wszystko jest zbudowane z tego samego kompilatora. Ale co z projektami takimi jak Mozilla Firefox, które wysyłają plik binarny podobno zgodny z wieloma potencjalnymi celami? Wiem, że jednym ze sposobów jest statyczne powiązanie zależności C++, co zmniejsza problemy związane z niekompatybilnością ABI i ogranicza zewnętrzne łączenie tylko do kilku bibliotek C, ale kiedy patrzę na rzeczywistą wersję binarną Firefoksa (z wersji Mozilal dla systemu Linux x86_64), widzę to :

ldd firefox 
    linux-vdso.so.1 (0x00007fff561fc000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff868c9f000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff868a9b000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff868892000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff868587000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff868286000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff86806f000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff867cc6000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007ff868ee8000) 

Tutaj Firefox dynamicznie łączy się z libstdC++. Więc jak to właściwie działa w różnych wersjach libstdC++ lub po prostu zakłada kompatybilność ABI i to wszystko?

+1

Biblioteki współdzielone powinny zapewniać niezależne kompilatory ABI. –

+0

@ πάνταῥεῖ: Ale niestety, [nazwa manglinga] (https://en.wikipedia.org/wiki/Name_mangling) to prawdopodobnie kompilator i [ABI] (http://en.wikipedia.org/wiki/Application_binary_interface) specyficzne - nawet jeśli większość z nich jest wspólna dla wszystkich kompilatorów dla danego systemu. –

+0

Cóż, w tym przypadku współużytkowany libstdC++. So.6 jest wyraźnie zależny od kompilatora. Jak to działa? Na przykład, czy jest kompatybilny z różnymi wersjami GCC? – shmerl

Odpowiedz

0

Wspólna droga ...

  • Projektant/programista decyduje, który (-a) biblioteki do wykorzystania. Tutaj można podać opcję statycznego połączenia (-> konfiguracja kompilacji).

  • Projektant także wybiera, czy i jak weryfikować wersje używanych bibliotek w czasie kompilacji i/lub czasu instalacji i/lub czasu pracy.

  • Pakowacz tworzący pakiet binarny dla odrębnego celu zwykle skompiluje plik binarny z łańcuchem narzędzi narzędzia i bibliotekami.

  • Jeśli do różnych celów jest potrzebna dystrybucja tylko dla binarnych danych, pakiet musi zapewnić sposób sprawdzenia środowiska i używanych bibliotek w czasie instalacji (-> instalator). Instalator lub sama aplikacja może sprawdzić, który łańcuch narzędzi został użyty do zbudowania biblioteki współdzielonej i kontynuować, przerwać z błędem lub wydać ostrzeżenie i zaoferować kontynuację.

  • Pakujący może dostarczyć zestaw modułów binarnych w pakiecie, a program instalacyjny wybierze te, które są potrzebne i są zgodne z określonym obiektem docelowym i środowiskiem w czasie instalacji.

Jest oczywiście lege artis i powinny być wspólna droga uniknąć każdy zakładając - i ewentualnie pozostawić go do użytkownika, aby zignorować wszelkie ostrzeżenia i spróbować szczęścia.

Powiązane problemy