Oczywistą odpowiedzią, choć nie najbardziej wyczerpującą, jest sprawdzenie menedżera pakietów, np
rpm -qi glibc
dpkg -l libc6
(Niestety, glibc nie ma .pcpliku pkconfig , więc nie jest programem uruchamiającym pkgconfig --modversion glibc.) Zobacz także doskonałą getconfsugestię @ Gnouc .
Najprostszym przypadkiem, z gcc + glibc, i tym, którego najczęściej używam jako pierwszego, jest po prostu wykonanie libc.so, jak opisano w niektórych innych odpowiedziach tutaj. Nie trzeba przekazywać żadnych argumentów, domyślnie wyświetla ona swoją wersję. To działa aż do glibc-2.1 (seg-fault glibc-2.0, choć dawno temu można było sprawdzić (obecnie wycofany) glibcbugskrypt, aby potwierdzić wersję). Ta metoda działa również z najnowszymi (> 0.9.15) wersjami musl-libc (które właśnie weszły 1.0 dzisiaj, 20 marca). Nie działa z uClibc, powoduje awarie.
Jednym prostym sposobem na dokładne określenie, co gcczamierzasz zrobić, jest kompilacja:
#include <gnu/libc-version.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%s %s\n",gnu_get_libc_version(),gnu_get_libc_release());
printf("glibc v%i %i.%i\n",__GNU_LIBRARY__,__GLIBC__,__GLIBC_MINOR__);
return 0;
}
(z glibc, <stdio.h>zawiera <features.h>który określa odpowiednie makra glibc musisz <gnu/libc-version.h>do deklaracji funkcji.)
Łapie to bardziej złożone przypadki (wiele bibliotek libc i / lub wiele kompilatorów), zakładając oczywiście, że używasz właściwego kompilatora (i flag). (Podejrzewam, że nie rozróżnia jednak właściwego eglibc od glibc).
Jeśli masz pewność, że używasz glibc (lub eglibc) ld, potwierdzi również wersję (przepraszam, to nie jest poprawne).
Jeśli __GNU_LIBRARY__nie zostanie zdefiniowane, pojawią się błędy, czas na plan B.
gcc -dumpmachinemoże pomóc, np. dla uclibc ma -uclibcsufiks, tak jak może gcc -dumpspecs | grep dynamic-linker. Może to również oznaczać ABI.
gcc -print-file-name=libc.sopowie ci, jakiego pliku użyje kompilator dla „ -lc”, jest to prawie na pewno skrypt łączący w instalacji gcc, który możesz odczytać jako zwykły tekst. To pokaże dokładną ścieżkę do libc.so. Będzie to również działać, jeśli podajesz flagi takie jak -m32lub -m64.
W przypadku korzystania z uclibc (używanego przez OpenWRT i inne), definiuje on __UCLIBC_MAJOR__, __UCLIBC_MINOR__a __UCLIBC_SUBLEVEL__także __UCLIBC__w <features.h>, więc można go łatwo wykryć za pomocą niewielkiej odmiany powyższego fragmentu kodu C. W interesie kompatybilności uClibc może również definiować makra GNU / GLIBC, jak użyto powyżej, obecnie udaje, że jest glibc-2.2. Nie ma obecnie realizować gnu_get_libc_X()funkcje, ale nie wdrożyć getconfktóre również mogą wprowadzać w błąd (podejrzewam, że zwraca pustą odpowiedź na getconf GNU_LIBC_VERSIONmój build env jest dąsać dzisiaj więc nie mogę potwierdzić).
W mało prawdopodobnym przypadku korzystania z dietlibc , bieganie diet -vwyświetli wersję.
(FWIW, przez kilka lat z oprogramowaniem używającym autoconf miałem więcej problemów z niesprawdzonymi gcci g++wymaganymi wymaganiami niż z sprawdzonymi funkcjami glibc).