gnu_get_libc_version 标识 GNU C 库的 runtime 版本。
如果您关心的是 compile-time 版本(即在/usr/include 中提供标头的版本),您应该查看宏__GLIBC__ 和__GLIBC_MINOR__ .这些扩展为正整数,并将被定义为包含 GNU C 库提供的 any 头文件的副作用;这意味着您可以包含标准标头,然后使用#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
在正常情况下,“运行时”版本可能大于“编译时”版本,但绝不会更小。主版本号不太可能再次更改(上一次更改是 1997 年的“libc6 过渡”)。
如果您希望使用 shell 'one-liner' 来转储这些宏,请使用:
echo '#include <errno.h>' | gcc -xc - -E -dM |
grep -E '^#define __GLIBC(|_MINOR)__ ' | sort
grep 模式被选择为仅匹配两个相关的宏,因为有几十个名为 __GLIBC_somethingorother 的内部宏您不想通读。