2016-04-17 14 views
7

मैं जानना चाहता हूं कि मुझे जीसीसी के बजाय एलडी लिंकर का उपयोग कब करना चाहिए। मैंने अभी सी ++ में एक सरल हैलो वर्ल्ड लिखा है, बेशक मैं आईस्ट्रीम लाइब्रेरी शामिल करता हूं। अगर मैं जीसीसी के साथ एक द्विआधारी फाइल बनाना चाहता हूं तो मैं बस उपयोग करता हूं:जब मुझे जीसीसी के बजाय एलडी का उपयोग करना चाहिए?

g++ hello hello.cpp और मुझे अपनी बाइनरी फ़ाइल मिली है।

बाद में मैं एलडी लिंकर का उपयोग करने की कोशिश करता हूं। ऑब्जेक्ट फ़ाइल प्राप्त करने के लिए मैं उपयोग करता हूं: g++ -c hello.cpp। ठीक है कि यह आसान था, लेकिन लिंक कमांड बहुत भयानक था:

ld -o hello.out hello.o -L /usr/lib/gcc/x86_64-linux-gnu/4.8.4/ /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o /usr/lib/x86_64-linux-gnu/crt1.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lstdc++ -lc

मुझे पता है कि gcc एलडी का उपयोग करता है। gcc का उपयोग सभी मामलों में या बस ज्यादातर मामलों में बेहतर है? कृपया, मुझे उन मामलों के बारे में कुछ बताएं जहां एलडी लिंकर का लाभ है।

+1

लिंकर का उपयोग केवल तभी होता है जब आप जीसीसी का उपयोग नहीं कर रहे हों। अन्यथा 'gcc' या' g ++ 'का उपयोग करके आपको बहुत अधिक टाइपिंग और अधिक महत्वपूर्ण रूप से सहेजने के लिए जा रहा है, यह जानने के लिए कि आपको किस प्रकार टाइप करना है और कब। –

+0

धन्यवाद, मुझे डर था कि मुझे एलडी का कोई उपयोगी उपयोग नहीं हुआ। बीटीडब्ल्यू आप g++ -v -o hello hello.cpp का उपयोग कर सकते हैं जो पुस्तकालयों को आपको लिंक करने की आवश्यकता है। तो लिंक फाइल/liberries के बारे में सभी कार्यों, मैं जीसीसी का उपयोग कर सेट कर सकते हैं? – Ice

+1

समस्या यह है कि ऑब्जेक्ट फ़ाइलों, पुस्तकालयों और विकल्पों की सूची आपके द्वारा उपयोग किए जाने वाले जीसीसी विकल्पों के आधार पर बदल जाएगी, आप किस ओएस का उपयोग कर रहे हैं, जीसीसी का कौन सा संस्करण और संभावित रूप से अन्य कारक हैं। ध्यान दें कि आप 'gcc -o hello hello.o' जैसे कमांड का उपयोग करके जीसीसी के साथ बनाई गई ऑब्जेक्ट फ़ाइल को लिंक कर सकते हैं। –

उत्तर

6

जैसा कि आपने बताया है, जीसीसी केवल लिंक समय पर एलडी के सामने के अंत के रूप में कार्य करता है; यह सभी लिंकर निर्देश (विकल्प, डिफ़ॉल्ट/सिस्टम पुस्तकालय, आदि ..) को पास करता है, और यह सुनिश्चित करता है कि इन सभी टूलचेन-विशिष्ट विवरणों का ख्याल रखकर सबकुछ अच्छी तरह से फिट हो जाए।

मेरा मानना ​​है कि जीएनयू टूलचैन को पूरी तरह से कड़े एकीकृत वातावरण के रूप में मानना ​​सबसे अच्छा है (जैसा कि कुछ विदेशी एम्बेडेड प्लेटफार्मों के लिए टूलचेंस बनाने के अनुभव के साथ किसी भी व्यक्ति के साथ, कह सकता है कि डाइटलिब एकीकरण शायद सहमत होगा)।

जब तक आपके पास कुछ विशिष्ट प्लेटफॉर्म एकीकरण आवश्यकताएं नहीं हैं, या जिनके पास जीसीसी का उपयोग न करने के कारण हैं, तो मैं लिंकिंग के लिए सीधे ld का आविष्कार करने के किसी भी लाभ के बारे में सोच सकता हूं। आपके लिए आवश्यक अतिरिक्त लिंकर-विशिष्ट विकल्प को आसानी से -Wl, उपसर्ग को जीसीसी कमांड लाइन पर निर्दिष्ट किया जा सकता है (यदि पहले से ही सादा जीसीसी विकल्प के रूप में उपलब्ध नहीं है)।

+1

निष्कर्ष में, एलडी आपको जुड़े फाइलों पर अधिक नियंत्रण/knowlegde देता है, मैं सही ढंग से समझता हूं? – Ice

+1

यह एक अच्छा, दर्द रहित एकीकरण की गारंटी देने वाले जीसीसी की बात है (इसमें शामिल कई कारकों के बारे में @RossRidge की टिप्पणी देखें)। आपको जिस भी एलडी विकल्प की आवश्यकता हो सकती है, वह अभी भी '-ब्लब्लूएल' के साथ जीसीसी से गुज़र सकती है। – xbug

2

यह ज्यादातर स्वाद का विषय है: आप ld का उपयोग सीधे करेंगे जब कमांड लाइन gcc का उपयोग करने से सरल होती हैं। ऐसा तब होगा जब आप कुछ छोटी निर्भरताओं के साथ साझा लाइब्रेरी बनाने के लिए साझा वस्तुओं की एक छोटी संख्या में हेरफेर करने के लिए लिंकर का उपयोग कर रहे हों।

क्योंकि आप ld पर -Wl विकल्प के माध्यम से विकल्प पास कर सकते हैं, अक्सर लोग कमांड लाइन का प्रबंधन करने के लिए केवल gcc का उपयोग करने की सलाह देंगे।

संबंधित मुद्दे