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ó .pctệp pkconfig , vì vậy pkgconfig --modversion glibckhô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 gccsẽ 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ì ldcũ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 -dumpmachinecó thể giúp đỡ, ví dụ như đối với uclibc, nó có -uclibchậu tố gcc -dumpspecs | grep dynamic-linker. Điều này cũng có thể ngụ ý ABI.
gcc -print-file-name=libc.sosẽ 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ư -m32hoặ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 getconfmà 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 -vsẽ 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 gccvà g++yêu cầu không được kiểm tra so với các tính năng glibc đã kiểm tra.)