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?
Biblioteki współdzielone powinny zapewniać niezależne kompilatory ABI. –
@ πάνταῥεῖ: 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. –
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