एक पुस्तकालय को सांख्यिकीय रूप से जोड़ने के लिए सीधे जीसीसी को बताना


133

यह -Wl,-Bstaticबताना मुझे अजीब लगता है gccकि मैं किन पुस्तकालयों को सांख्यिकीय रूप से जोड़ना चाहता हूं। आखिरकार मैं gccपुस्तकालयों ( -Ldir, -llibname) के साथ जोड़ने के बारे में सीधे अन्य सभी जानकारी बता रहा हूं ।

क्या सीधे gcc ड्राइवर को यह बताना संभव है कि किन पुस्तकालयों को सांख्यिकीय रूप से जोड़ा जाना चाहिए?

स्पष्टता: मुझे पता है कि अगर एक निश्चित पुस्तकालय केवल स्थिर संस्करणों में मौजूद है -Wl,-Bstatic, तो वह बिना इसका उपयोग करेगा , लेकिन मैं gccस्थैतिक पुस्तकालय को प्राथमिकता देना चाहता हूं । मुझे यह भी पता है कि लाइब्रेरी फ़ाइल को सीधे निर्दिष्ट करना इसके साथ जुड़ा होगा, लेकिन मैं स्थैतिक और गतिशील पुस्तकालयों को शामिल करने के लिए शब्दार्थ रखना पसंद करता हूं।

जवाबों:


189

यह संभव है, के -l:बजाय का उपयोग करें -l। उदाहरण के लिए -l:libXYZ.aके साथ लिंक करने के लिए libXYZ.a। के libरूप में -lXYZऑटो करने के लिए विस्तार होगा, जो के रूप में बाहर लिखा नोटिस libXYZ


63
यदि केवल उपसर्ग पागलपन के बजाय पहले स्थान पर भगवान ने इसे डिफ़ॉल्ट बनाया है तो भगवान। अरे समय और हताशा हमने बचा ली होती।
टिम्मम

9
Radek, क्या यह -l:विकल्प प्रलेखित है? जीसीसी के किस संस्करण का उपयोग करने की आवश्यकता है?
ऑग्सक्स

18
दरअसल, यह ldlinker sourceware.org/binutils/docs/ld/Options.html का विकल्प है -l namespec " .. यदि नामस्थान फॉर्म का है: फ़ाइल नाम, ld फ़ाइल नाम के लिए लाइब्रेरी पथ खोजेगा, अन्यथा यह लाइब्रेरी की खोज करेगा। libnamespec.a .. फ़ाइल के लिए पथ। ELF .. सिस्टम पर, ld libnamespec.so नामक एक लाइब्रेरी के लिए एक निर्देशिका खोजेगा, जिसे libnamespec.a कहा जाता है। खोज करने के लिए। यह व्यवहार लागू नहीं होता है: फ़ाइल नाम। , जो हमेशा फ़ाइलनाम नामक फ़ाइल निर्दिष्ट करता है। " चूंकि बिनुटिल्स २.१18
२६

17
इस इंटरफ़ेस के लिए GNU कहीं से भी ज़िम्मेदार नहीं है, इसे यूनिक्स टूलकिन से विरासत में मिला था।
akim

यह बहुत शर्म की बात है कि यह गैर-जीएनयू लिंकर्स में काम नहीं करता है। यह LDLIBS को "मजबूर" करने का एक अच्छा तरीका है और अजीब लिंक फ्लैग वर्कअराउंड के बिना स्थिर पुस्तकालयों को खोजने के लिए समान कॉन्फ़िगर विकल्प है।
nnonneo

130

आप लिंकिंग कमांड में .a फ़ाइल जोड़ सकते हैं:

  gcc yourfiles /path/to/library/libLIBRARY.a

लेकिन यह gcc ड्राइवर के साथ बात नहीं कर रहा है, लेकिन ldलिंकर के साथ जैसे विकल्प -Wl,anythingहैं।

जब आप gcc या ld बताएंगे -Ldir -lLIBRARY, तो लिंकर लाइब्रेरी के स्थिर और गतिशील दोनों संस्करणों की जाँच करेगा (आप इसके साथ एक प्रक्रिया देख सकते हैं -Wl,--verbose)। पुस्तकालय प्रकारों के क्रम को बदलने के लिए आप उपयोग कर सकते हैं -Wl,-Bstaticऔर जाँच की -Wl,-Bdynamic। यहाँ gnu LD का एक आदमी पृष्ठ है: http://linux.die.net/man/1/ld

अपने प्रोग्राम को lib1, lib3 के साथ गतिशील रूप से और lib2 को सांख्यिकीय रूप से जोड़ने के लिए, ऐसे gcc कॉल का उपयोग करें:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

मान लें कि ld की डिफ़ॉल्ट सेटिंग डायनेमिक लाइब्रेरीज़ (यह लिनक्स पर है) का उपयोग करना है।


3
लघु संस्करण: वर्तमान के साथ ऐसा करने का कोई तरीका नहीं है gcc
एलाज़ लीबोविच

7
एलज़ार लीबोविच, लेकिन gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3चाल करता है।
ओएसजीएक्स

13
लिंकिंग (और dyn / static libs की खोज) लिंकर द्वारा की जाती है, इसलिए, आपको लिंकर विकल्पों का उपयोग करना होगा। -lऔर -Lलिंकर विकल्प भी हैं।
10

3
क्या यह उत्तर उत्तपन्न है gcc yourfiles /path/to/library/libLIBRARY.aया -Wl,-Bstatic?
टोर क्लिंगबर्ग

7
@TorKlingberg, वेरिएंट 1 /path/to/library/libLIBRARY.aको पूरा रास्ता लिखे जाने की ज़रूरत है, वेरिएंट 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicअभी लंबा है और 2 अतिरिक्त विकल्प जोड़ता है और डिफ़ॉल्ट मोड को Bdynamic मानता है, और स्वीकार किया गया वेरिएंट 3 -l:libXYZ.aछोटा है और बस काम करता है। स्थैतिक कार्यक्रमों को जोड़ने पर तीनों कई मामलों के लिए काम करेंगे, और संस्करण 2 काम नहीं कर सकते हैं। लिब के लिए वास्तविक लिंकिंग चरण सभी वेरिएंट में समान है जैसा कि मैं समझता हूं।
असग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.