Câu trả lời rõ ràng, mặc dù không phải là toàn diện nhất, là kiểm tra trình quản lý gói của bạn, vd
rpm -qi glibc
dpkg -l libc6
(Đáng buồn thay, glibc không có .pc
tệp pkconfig , vì vậy pkgconfig --modversion glibc
không phải là người chạy.) Xem thêm getconf
đề xuất tuyệt vời của @ Gnouc .
Trường hợp đơn giản nhất, với gcc + glibc, và trường hợp tôi chủ yếu sử dụng đầu tiên là chỉ thực hiện libc.so
, như được nêu trong một số câu trả lời khác ở đây. Không cần phải vượt qua bất kỳ đối số nào, nó xuất ra phiên bản của nó theo mặc định. Điều này hoạt động trở lại như glibc-2.1 (lỗi phân tách glibc-2.0, mặc dù cách đó trở lại sau đó bạn có thể kiểm tra tập lệnh (hiện đã nghỉ hưu) glibcbug
để xác nhận phiên bản). Phương pháp này cũng hoạt động với các phiên bản gần đây (> 0.9.15) của musl-libc (vừa mới ra mắt ngày hôm nay, 20 tháng 3). Nó không hoạt động với uClibc, nó segfaults.
Một cách đơn giản để nói chính xác những gì bạn gcc
sẽ làm là biên dịch:
#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;
}
(với glibc, <stdio.h>
bao gồm <features.h>
định nghĩa các macro GLIBC có liên quan, bạn cần <gnu/libc-version.h>
cho các khai báo hàm.)
Điều này nắm bắt các trường hợp phức tạp hơn (nhiều libc và / hoặc nhiều trình biên dịch), giả sử bạn đang sử dụng đúng trình biên dịch (và cờ). (Tôi nghi ngờ rằng nó sẽ không phân biệt giữa eglibc và glibc thích hợp.)
Nếu bạn chắc chắn rằng bạn đang sử dụng glibc (hoặc eglibc) thì ld
cũng sẽ xác nhận phiên bản (xin lỗi, điều này không chính xác).
Nếu __GNU_LIBRARY__
không được xác định, bạn sẽ gặp lỗi, đó là thời gian cho kế hoạch B.
gcc -dumpmachine
có thể giúp đỡ, ví dụ như đối với uclibc, nó có -uclibc
hậu tố gcc -dumpspecs | grep dynamic-linker
. Điều này cũng có thể ngụ ý ABI.
gcc -print-file-name=libc.so
sẽ cho bạn biết trình biên dịch nào sẽ sử dụng cho " -lc
", đây gần như chắc chắn là một tập lệnh liên kết trong cài đặt gcc của bạn, mà bạn có thể đọc nó dưới dạng văn bản thuần túy. Điều đó sẽ chỉ ra đường dẫn chính xác đến libc.so
. Điều này cũng sẽ hoạt động nếu bạn truyền cờ như -m32
hoặc -m64
.
Trong trường hợp bạn đang sử dụng uclibc (như được sử dụng bởi OpenWRT và nhiều hơn nữa), nó định nghĩa __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
và __UCLIBC_SUBLEVEL__
cũng như __UCLIBC__
trong <features.h>
, vì vậy nó dễ dàng phát hiện sử dụng một biến thể nhỏ trên trên C đoạn mã. Vì lợi ích của tính tương thích, uClibc cũng có thể định nghĩa các macro GNU / GLIBC như được sử dụng ở trên, hiện tại nó giả vờ là glibc-2.2. Nó hiện không thực hiện các gnu_get_libc_X()
chức năng, nhưng nó không thực hiện getconf
mà cũng có thể gây nhầm lẫn (tôi nghi ngờ nó sẽ trả về một câu trả lời trống getconf GNU_LIBC_VERSION
, xây dựng của tôi env đang hờn dỗi ngày nay vì vậy tôi không thể xác nhận.)
Trong trường hợp không thể xảy ra khi bạn sử dụng dietlibc , chạy diet -v
sẽ hiển thị phiên bản.
(FWIW, trong nhiều năm với phần mềm sử dụng autoconf, tôi gặp nhiều vấn đề hơn với các yêu cầu gcc
và g++
yêu cầu không được kiểm tra so với các tính năng glibc đã kiểm tra.)