gnu_get_libc_version
идентифицирует версию библиотеки GNU C.
Если вас волнует версия времени компиляции (то есть версия, предоставившая заголовки в /usr/include
), вам следует взглянуть на макросы __GLIBC__
и __GLIBC_MINOR__
. Они расширяются до положительных целых чисел и будут определены как побочный эффект от включения любого файла заголовка, предоставленного библиотекой GNU C; это означает, что вы можете включить стандартный заголовок, а затем использовать #ifdef __GLIBC__
, чтобы решить, можете ли вы включить нестандартный заголовок, такой как gnu/libc-version.h
.
Расширение тестовой программы из принятого ответа:
#include <stdio.h>
#ifdef __GLIBC__
#include <gnu/libc-version.h>
#endif
int
main(void)
{
#ifdef __GLIBC__
printf("GNU libc compile-time version: %u.%u\n", __GLIBC__, __GLIBC_MINOR__);
printf("GNU libc runtime version: %s\n", gnu_get_libc_version());
return 0;
#else
puts("Not the GNU C Library");
return 1;
#endif
}
Когда я компилирую и запускаю эту программу на компьютере, я набираю этот ответ (на Mac), он печатает
Not the GNU C Library
но при компиляции и запуске на соседней Linux-машине он печатает
GNU libc compile-time version: 2.24
GNU libc runtime version: 2.24
В нормальных условиях версия «времени выполнения» может быть больше, чем версия «времени компиляции», но никогда не меньше. Номер основной версии вряд ли когда-либо снова изменится (последний раз, когда он менялся, был «переход libc6» в 1997 году).
Если вы хотите, чтобы оболочка 'one-liner' выводила эти макросы, используйте:
echo '#include <errno.h>' | gcc -xc - -E -dM |
grep -E '^#define __GLIBC(|_MINOR)__ ' | sort
Шаблон grep
выбран для соответствия только двум релевантным макросам, потому что существуют десятки внутренних макросов с именем __GLIBC_somethingorother
, которые вам не нужно читать.