2011-01-05 12 views
56

मुझे अभी पता चला है कि गणित पुस्तकालय से एक फ़ंक्शन को संदर्भित करने वाले प्रोग्राम को संकलित करने के लिए -lm ध्वज की आवश्यकता है। मैं सोच रहा हूं कि समय पुस्तकालय जैसे अन्य पुस्तकालयों वाले कार्यक्रमों को संकलित करते समय एक स्पष्ट लिंकिंग ध्वज की आवश्यकता क्यों नहीं है। यदि मैं एक प्रोग्राम लिखता हूं जहां time() फ़ंक्शन कहा जाता है, तो यह कोई लिंकिंग विकल्प के साथ भी कोई समस्या नहीं संकलित करेगा। लेकिन गणित पुस्तकालय के साथ एक कार्यक्रम सिर्फ -lm ध्वज के बिना काम नहीं करेगा।जीसीसी: गणित पुस्तकालय को जोड़ने के लिए -एलएम ध्वज की आवश्यकता क्यों है?

क्या कोई इस व्यवहार के पीछे कारण बता सकता है? आपके समय के लिए धन्यवाद।

+4

अजीब ऐतिहासिक कारण, लेकिन अधिकतर क्योंकि यह है यह कैसे है: http://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c – birryree

उत्तर

32

क्योंकि time() और कुछ अन्य कार्यों builtin सी पुस्तकालय (libc) में परिभाषित कर रहे हैं खुद को और जीसीसी हमेशा लिंक जब तक libc करने के लिए आप -ffreestanding संकलन विकल्प का उपयोग करें। हालांकि गणित कार्य libm में रहते हैं जो पूर्ण रूप से जीसीसी द्वारा लिंक नहीं किया जाता है।

+4

चालू एलएलवीएम जीसीसी मुझे -एलएम जोड़ने की ज़रूरत नहीं है। ऐसा क्यों है? –

55

हास्यास्पद ऐतिहासिक अभ्यास की वजह से कोई भी ठीक करने के इच्छुक नहीं है। सी और पॉज़िक्स द्वारा आवश्यक एक ही लाइब्रेरी फ़ाइल में आवश्यक सभी कार्यों को समेकित करने से न केवल इस प्रश्न से पूछे जाने वाले प्रश्नों से बचने के लिए, बल्कि गतिशील लिंकिंग के दौरान महत्वपूर्ण समय और स्मृति भी बचाएगा, क्योंकि प्रत्येक .so फ़ाइल से जुड़ी फाइल सिस्टम की आवश्यकता होती है संचालन पता लगाने के लिए और यह मिल जाए, और अपने स्थैतिक चर, relocations, आदि

कार्यान्वयन जहां सभी कार्य एक पुस्तकालय में हैं और -lm, -lpthread, -lrt, आदि के लिए कुछ पन्नों विकल्प सभी में कोई-ऑप्स हैं (या खाली .a फ़ाइलों के लिए लिंक) पूरी तरह से POSIX अनुरूप और निश्चित रूप से बेहतर है।

नोट: मैं पॉज़िक्स के बारे में बात कर रहा हूं क्योंकि सी स्वयं संकलक के बारे में कुछ भी निर्दिष्ट नहीं करता है। इस प्रकार आप gcc -std=c99 -lm का इलाज कर सकते हैं कार्यान्वयन-विशिष्ट तरीके के रूप में संकलक को अनुरूप व्यवहार के लिए बुलाया जाना चाहिए।

+8

+1 यह इंगित करने के लिए कि POSIX को अलग-अलग libm, libc और librt पुस्तकालयों की आवश्यकता नहीं है। उदाहरण के तौर पर, मैक ओएस पर सबकुछ एक ही libSystem में स्थित है (जिसमें libdbm, libdl, libgcc_s, libinfo, libm, libpoll, libproc और librpcsvc भी शामिल हैं)। –

+3

-1 किसी लिंक या संख्या के साथ बैक अप किए बिना प्रदर्शन पर लाइब्रेरी लुकअप प्रभाव के बारे में अनुमान लगाने के लिए। "प्रोफाइल। अटकलें मत करें" –

+7

यह अटकलें नहीं है। मेरे पास कोई प्रकाशित कागजात नहीं हैं, लेकिन मैंने स्वयं सभी माप किए हैं और अंतर बहुत बड़ा है। डायनामिक लिंकिंग पर कितना स्टार्टअप टाइम खर्च किया गया है, या सिस्टम पर चल रहे '।/Config' की तुलना करने के लिए बस समय विकल्पों में से एक के साथ 'स्ट्रेस' का उपयोग करें, जहां सभी मानक उपयोगिताओं स्थिर-लिंक्ड बनाम एक हैं जहां वे गतिशील हैं -जुड़े हुए। यहां तक ​​कि मुख्यधारा के डेस्कटॉप ऐप डेवलपर और सिस्टम इंटीग्रेटर्स गतिशील लिंकिंग की लागत से अवगत हैं; यही कारण है कि प्रीलिंक जैसी चीजें मौजूद हैं। मुझे यकीन है कि आप उन कागजात में से कुछ में बेंचमार्क पा सकते हैं। –