Очевидный ответ, хотя и не самый полный, состоит в том, чтобы проверить ваш менеджер пакетов, например
rpm -qi glibc
dpkg -l libc6
(К сожалению, у glibc нет .pc
файла pkconfig , поэтому он не участвует pkgconfig --modversion glibc
.) Смотрите также превосходное getconf
предложение @ Gnouc .
Простейший случай с gcc + glibc и тот, который я в основном использую первым, - просто выполнить libc.so
, как описано в некоторых других ответах здесь. Нет необходимости передавать аргументы, по умолчанию выводится его версия. Это работает вплоть до glibc-2.1 (ошибки сегмента glibc-2.0, хотя еще тогда вы могли проверить (теперь уже удаленный) glibcbug
скрипт для подтверждения версии). Этот метод также работает с последними (> 0.9.15) версиями musl-libc (которая вышла 1.0 сегодня, 20 марта). Это не работает с uClibc, это segfaults.
Один простой способ точно сказать, что вы gcc
собираетесь делать - это скомпилировать:
#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;
}
(с glibc, <stdio.h>
включает в себя , <features.h>
которая определяет соответствующие GLIBC макросы, вам необходимо <gnu/libc-version.h>
для объявления функций.)
Это позволяет отследить более сложные случаи (несколько libc и / или несколько компиляторов), если, конечно, вы используете правильный компилятор (и флаги). (Я подозреваю, что он не будет различать между eglibc и glibc).
Если вы уверены, что используете glibc (или eglibc), то ld
также подтвердите версию (извините, это неверно).
Если __GNU_LIBRARY__
не определено, вы получите ошибки, то пришло время для плана B.
gcc -dumpmachine
может помочь, например, для uclibc он имеет -uclibc
суффикс, как может gcc -dumpspecs | grep dynamic-linker
. Это также может подразумевать ABI.
gcc -print-file-name=libc.so
скажет вам, какой файл компилятор будет использовать для " -lc
", это почти наверняка компоновщик-скрипт в вашей установке gcc, который вы можете прочитать как обычный текст. Это покажет точный путь к libc.so
. Это также будет работать, если вы передаете флаги типа -m32
или -m64
.
В случае , если вы используете uclibc (как используются OpenWRT и более), оно определяет __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
и __UCLIBC_SUBLEVEL__
так же , как __UCLIBC__
в <features.h>
, так что это легко обнаруживается с помощью изменения незначительного по вышеуказанному C фрагменте кода. В интересах совместимости, uClibc может также определять макросы GNU / GLIBC, как использовано выше, в настоящее время он претендует на то, чтобы быть glibc-2.2. Она в настоящее время не выполнять gnu_get_libc_X()
функции, но это осуществить , getconf
который также может ввести в заблуждение (я подозреваю , что он возвращает пустой ответ на getconf GNU_LIBC_VERSION
мой билд окр дуется сегодня , поэтому я не могу подтвердить.)
В маловероятном случае, если вы используете dietlibc , при запуске diet -v
будет отображаться версия.
(FWIW, в течение нескольких лет с программным обеспечением, использующим autoconf, у меня было больше проблем с непроверенными требованиями gcc
и g++
требованиями, чем с проверенными функциями glibc.)