--Start-group और --end-group कमांड लाइन विकल्प क्या हैं?


83

उन कमांड लाइन विकल्पों का उद्देश्य क्या है? कृपया निम्नलिखित कमांड लाइन के अर्थ को समझने में मदद करें:

जाहिरा तौर पर यह जोड़ने के साथ कुछ करना है, लेकिन GNU मैनुअल शांत है जो वास्तव में समूहीकरण का मतलब है।

जवाबों:


97

यह कई पुस्तकालयों (बीच सूचीबद्ध -(और -)) के बीच परिपत्र निर्भरता को हल करने के लिए है ।

हवाला देते हुए कहा गया है कि जिस क्रम में पुस्तकालयों को जोड़ा जाता है वह कभी-कभी जीसीसी में त्रुटियों का कारण क्यों बनता है? या man ld http://linux.die.net/man/1/ld

-( अभिलेखागार -) या --start-group अभिलेखागार --end-group

अभिलेखागार संग्रह फ़ाइलों की एक सूची होना चाहिए। वे या तो स्पष्ट नाम, या -l विकल्प हो सकते हैं।

निर्दिष्ट अभिलेखों को बार-बार खोजा जाता है जब तक कि कोई नया अपरिभाषित संदर्भ नहीं बनाया जाता है। आम तौर पर, एक आर्काइव केवल एक बार उस क्रम में खोजा जाता है जिसे वह कमांड लाइन पर निर्दिष्ट करता है। यदि संग्रह में किसी ऑब्जेक्ट द्वारा संदर्भित अपरिभाषित प्रतीक को हल करने के लिए उस संग्रह में एक प्रतीक की आवश्यकता होती है, जो बाद में कमांड लाइन पर दिखाई देता है, तो लिंकर उस संदर्भ को हल करने में सक्षम नहीं होगा। अभिलेखों को समूहीकृत करके, जब तक सभी संभावित संदर्भों को हल नहीं किया जाता है, तब तक वे सभी बार-बार खोजे जाते हैं।

इस विकल्प का उपयोग करने के लिए एक महत्वपूर्ण प्रदर्शन लागत है। इसका उपयोग केवल तभी करना सबसे अच्छा है जब दो या अधिक अभिलेखों के बीच अपरिहार्य परिपत्र संदर्भ हों।

इसलिए, समूह के अंदर पुस्तकालयों को कई बार नए प्रतीकों के लिए खोजा जा सकता है, और आपको किसी भी तरह के बदसूरत निर्माण की आवश्यकता नहीं है -llib1 -llib2 -llib1

PS संग्रह का अर्थ है मूल रूप से एक स्थिर पुस्तकालय ( *.aफाइलें)


1
स्वीकार किए जाते हैं। एक टिप्पणी: मेरा मानना ​​है कि जीसीसी पहले गतिशील पुस्तकालयों के लिए जाता है, जब तक कि कमांड लाइन में पूर्ण फ़ाइल नाम (पथ और .a प्रत्यय सहित) पारित नहीं हो जाता। -llib1 के कारण GCC पहले% .so फ़ाइल से लिंक करने का प्रयास करेगा और फिर% .a फ़ाइल का प्रयास करेगा।
pic11

1
@ pic11, धन्यवाद। लिंक करना ld द्वारा किया जाता है, और आप देख सकते हैं कि कैसे पुस्तकालयों -Wl,--verboseको gcc में जोड़ने के विकल्प के साथ खोजा जाता है (यह --verboseलिंकर l के पास जाएगा )। -ltestपुस्तकालय के लिए attempt to open /lib/libtest.so failed \n attempt to open /lib/libtest.a failed \n attempt to open /usr/lib/libtest.so failed \n attempt to open /usr/lib/libtest.a failed \n :। लिंकर .soपहले खोलने की कोशिश करता है , लेकिन फिर यह खोलने की कोशिश करता है .a। यह पुस्तकालय खोज डायरियों में हर निर्देशिका में किया जाता है।
osgx

"कई बार नए प्रतीकों की खोज की"? मुझे लगता है कि सभी प्रतीकों को हल करने के लिए दो बार खोज करना पर्याप्त है। यह एक महत्वपूर्ण प्रदर्शन लागत नहीं होना चाहिए ।
जिम चेन

10
क्षमा करें, मुझे अंत में एहसास हुआ कि "दो बार खोजना" पर्याप्त नहीं है।
जिम चेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.