स्पष्ट जवाब, हालांकि सबसे व्यापक नहीं है, अपने पैकेज मैनेजर की जांच करना है, जैसे
rpm -qi glibc
dpkg -l libc6
(अफसोस की बात है, glibc के पास एक pkconfig .pc
फ़ाइल नहीं है , इसलिए pkgconfig --modversion glibc
वह एक गैर-धावक है।) @ Gnouc का उत्कृष्ट getconf
सुझाव भी देखें ।
सरलतम मामला, gcc + glibc के साथ, और जो मैं ज्यादातर उपयोग करता हूं, वह केवल निष्पादित करने के लिए है libc.so
, जैसा कि यहां कुछ अन्य उत्तरों में उल्लिखित है। किसी भी तर्क को पारित करने की आवश्यकता नहीं है, यह डिफ़ॉल्ट रूप से इसके संस्करण को आउटपुट करता है। यह glibc-2.1 (glibc-2.0 seg-faults) के रूप में वापस काम करता है, हालांकि वापस तो आप 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, और / या कई संकलक) को पकड़ता है, यह मानते हुए कि आप सही संकलक (और झंडे) का उपयोग कर रहे हैं। (मुझे संदेह है कि यह ईगलिबेक और ग्लिबक के बीच उचित अंतर नहीं करेगा।)
यदि आप निश्चित हैं कि आप glibc (या eglibc) का उपयोग कर रहे हैं तो ld
संस्करण की पुष्टि भी करेगा (क्षमा करें, यह सही नहीं है)।
यदि __GNU_LIBRARY__
परिभाषित नहीं किया गया है तो आपको त्रुटियां मिलेंगी, तो यह योजना बी का समय है।
gcc -dumpmachine
मदद कर सकते हैं, जैसे uclibc के लिए इसका -uclibc
प्रत्यय हो सकता है, जैसा कि हो सकता है gcc -dumpspecs | grep dynamic-linker
। यह एबीआई को भी प्रभावित कर सकता है।
gcc -print-file-name=libc.so
आपको बताएगा कि कंपाइलर किस फाइल को " -lc
" के लिए उपयोग करेगा , यह निश्चित रूप से आपके जीसीसी इंस्टॉलेशन के भीतर एक लिंकर-स्क्रिप्ट है, जिसे आप इसे सादे पाठ के रूप में पढ़ सकते हैं। यही सही रास्ता दिखाएगा libc.so
। यह भी काम करेगा यदि आप झंडे की तरह गुजर रहे हैं -m32
या -m64
।
घटना में आप यूक्लिब का उपयोग कर रहे हैं (जैसा कि OpenWRT और अधिक द्वारा उपयोग किया जाता है), यह परिभाषित करता है __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
और __UCLIBC_SUBLEVEL__
साथ ही __UCLIBC__
में <features.h>
, इसलिए यह आसानी से उपरोक्त सी कोड स्निपेट पर एक मामूली बदलाव का उपयोग करके पता लगाया जाता है। अनुकूलता के हित में, UClibc GNU / GLIBC मैक्रोज़ को भी परिभाषित कर सकता है जैसा कि ऊपर बताया गया है, यह वर्तमान में glibc-2.2 होने का दिखावा करता है। यह वर्तमान में gnu_get_libc_X()
फ़ंक्शंस को लागू नहीं करता है , लेकिन यह लागू होता है getconf
जो गलत भी हो सकता है (मुझे संदेह है कि इसके लिए एक खाली उत्तर देता है getconf GNU_LIBC_VERSION
, मेरा बिल्ड एनवी आज व्यर्थ है इसलिए मैं पुष्टि नहीं कर सकता।)
असंभावित घटना में आप डाइटलिबक का उपयोग कर रहे हैं , रनिंग diet -v
संस्करण प्रदर्शित करेगा।
(Fwiw, autoconf का उपयोग कर सॉफ्टवेयर के साथ कई वर्षों से मैं अनियंत्रित-के लिए के साथ और अधिक समस्याओं लिया है gcc
और g++
साथ की तुलना में आवश्यकताओं की जाँच के लिए glibc सुविधाओं।)