2012-03-06 12 views
5

पर लाइब्रेरी स्थिर लिंकिंग बूस्ट करें मैं एक्सकोड का उपयोग कर ओएस एक्स पर बूस्ट लाइब्रेरी का उपयोग कर रहा हूं। मैकपोर्ट का उपयोग कर मेरे सिस्टम पर बूस्ट स्थापित किया गया था। मैंने लाइब्रेरीज़ सूची के साथ लक्ष्य 'लिंक बाइनरी' की आवश्यकता वाले 3 बूस्ट लाइब्रेरी (उदाहरण के लिए, libboost_thread-mt.a) जोड़कर सफलतापूर्वक अपना ऐप बनाया है। हालांकि मुझे इन पुस्तकालयों को स्थैतिक रूप से लिंक करने की आवश्यकता है ताकि ऐप इंस्टॉल किए जाने वाले बूस्ट लाइब्रेरी के बिना अन्य कंप्यूटरों पर चल सके।एक्सकोड 4

मैं यह कैसे कर सकता हूं? मेरी कई Google खोजों के माध्यम से मुझे लगता है कि मुझे '-स्टैटिक' जोड़ने की आवश्यकता हो सकती है - मैं इसे एक्सकोड में कहां जोड़ूं?

उत्तर

7

यदि आपने .a लाइब्रेरी से लिंक किया है, तो आप पहले ही स्थिर रूप से लिंक कर चुके हैं। आपको .a पुस्तकालयों को कभी भी शिप करने की आवश्यकता नहीं है। वे सिर्फ वस्तुओं के बंडल हैं।


संपादित करें: आपका त्रुटि दृढ़ता से पता चलता है कि आप ए से dylib लिंक कर रहे हैं बल्कि। यदि आपके पास लाइब्रेरी पथ में libfoo.dylib और libfoo.a है, भले ही आप "लिंक libfoo.a" एक्सकोड में कहते हैं, और यहां तक ​​कि libfoo.a पहले भी खोज पथ में है, तो यह अभी भी libfoo.dylib लिंक करेगा। ऐसा इसलिए है क्योंकि एक्सकोड का लिंक पूरी तरह से टूटा हुआ है और लिंकर को -lfoo पास करता है (आपको कभी भी बनाया गया कोई सटीक पथ नहीं है और आपको सटीक पथ रखने के लिए -l का उपयोग नहीं करना चाहिए)। मैं हमेशा निर्माण फलक का उपयोग करने के बजाय xcconfig फ़ाइल में LDFLAGS में बनाए गए पुस्तकालयों को जोड़ने की अनुशंसा करता हूं। आप -l का उपयोग करने के बजाय इच्छित पथ को पारित करते हैं। Xcconfig पर मेरे विचारों के लिए Abandoning the Build Panel देखें। यह अब पुराना है, क्योंकि यह एक्सकोड 3 के लिए लिखा गया था, लेकिन मूल बातें अभी भी लागू होती हैं।

बिल्ड फलक का उपयोग करके, आप "अन्य लिंकर ध्वज" में लाइब्रेरी में पूरा पथ भी पारित कर सकते हैं। लेकिन इसमें अभी भी बिल्ड फलक की सभी समस्याएं हैं।

तेज (लेकिन कम मजबूत) समाधान कभी-कभी "अन्य लिंकर ध्वज" में -Wl,-search_paths_first जोड़ने के लिए होता है। यह व्यवहार को बदलता है ताकि प्रत्येक पुस्तकालय पथ .dylib और .a दोनों पर जाने से पहले खोजा जा सके (डिफ़ॉल्ट व्यवहार .dylib के लिए हर जगह खोजना है और केवल तभी .a खोजें)। तो यदि आपका .a आपके .dylib से एक अलग निर्देशिका में है, और वह निर्देशिका पहले खोज पथ में है, तो यह काम करेगी।

इस प्रश्न ने मुझे अंत में radar खोलने के लिए मिला, जिसे मैंने कई साल पहले किया था। मैं अनुशंसा करता हूं कि अन्य duplicates खोलें।

+0

मैंने सोचा कि हालांकि एक अलग कंप्यूटर पर ऐप चलाने की कोशिश करते समय ऐप नहीं चलेगा और एक त्रुटि के साथ आता है जिसमें यह प्रासंगिक .dylib फ़ाइल का पता नहीं लगा सकता है। क्या .a फाइलें 'पुस्तकालयों के साथ लिंक बाइनरी' अनुभाग के अलावा कहीं और परियोजना से जुड़ी होनी चाहिए? –

+0

"बिल्ड फलक का उपयोग करके, आप" अन्य लिंकर ध्वज "में लाइब्रेरी में पूरा पथ भी पारित कर सकते हैं - इससे समस्या हल हो गई। धन्यवाद! –