2010-09-12 13 views
18

मेरे पास लिनक्स के लिए मेकफ़ाइल है जिसे मैं डार्विन पर भेज रहा हूं। मेकफ़ाइल .o फ़ाइलों का एक समूह लेता है और उन्हें एक साथ साझा किया जाता है। इसलिए साझा ऑब्जेक्ट। ठीक है, तो मैंने सोचा (क्या मैं इसके बारे में गलत हूं?) कि डार्विन में इसके लिए सबसे अच्छा एनालॉग डाइलिब है। तो मैंने -श्रेषित ध्वज को-गतिशीलता में बदल दिया।साझा लाइब्रेरी या डाइलिब में अपरिभाषित प्रतीकों के साथ सौदा क्या है?

अब कोड जो मैं डायलेब में एक साथ जोड़ रहा हूं, बाहरी पुस्तकालयों पर निर्भर करता है। जब मैं डाइलिब बनाने की कोशिश करता हूं, तो मुझे त्रुटियां मिलती हैं कि अपरिभाषित संदर्भ हैं। लेकिन लिनक्स मेकफ़ाइल किसी भी जो भी या -एल/​​पथ/निर्माण चरण में जो भी विकल्प बनाता है, वह निर्दिष्ट नहीं करता है .so फ़ाइल बनाता है। हम्म? ऐसा इसलिए है क्योंकि जब आप एक ईएलएफ .so फ़ाइल बनाते हैं, तो डिफ़ॉल्ट रूप से यह बाह्य संदर्भों को अनसुलझा करता है, और फिर साझा लाइब्रेरी लोड होने पर, रिकर्सिवली साझा लाइब्रेरी लोड करता है जो साझा की गई लाइब्रेरी द्वारा निर्भर हैं? क्या यह मामला नहीं होगा कि यदि साझा लाइब्रेरी एक .a या .o फ़ाइल पर निर्भर करती है, तो आपको उन्हें साझा लाइब्रेरी में स्थिर रूप से लिंक करना होगा, अन्यथा आप रनटाइम पर लिंक नहीं कर पाएंगे? रनटाइम पर लोड की गई लाइब्रेरी में अपरिभाषित संदर्भ होने से आप कैसे दूर हो सकते हैं, जब तक संदर्भ गतिशील रूप से लोड करने योग्य पुस्तकालयों तक न हों?

वैसे भी यदि ऐसा है तो मेरे द्वारा निर्दिष्ट

-undefined suppress -flat_namespace 

यह जब शेयर की गई लाइब्रेरी बनाने उन -l और एल विकल्प जोड़ने के लिए मुझे आवश्यकता नहीं है। लेकिन मुझे अभी भी समझ में नहीं आता कि यह अंततः कैसे काम कर सकता है।

उत्तर

1

libtool का उपयोग करें।

libtool -dynamic -multiply_defined suppress -install_name `basename ../../../../rlp/lib/universal-darwin9-gcc40/libbtutils.dylib` -o ../../../../rlp/lib/universal-darwin9-gcc40/libbtutils.dylib ../../../../rlp/lib/universal-darwin9-gcc40/libbtd.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttrie.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtkey.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtunit.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtutilities.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtopts.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtxcode.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtprops.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtxml.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttake3.a ../../../../rlp/lib/universal-darwin9-gcc40/libbttake5.a ../../../../rlp/lib/universal-darwin9-gcc40/libbtac.a -lstdc++.6 -lgcc_s.10.4 ../../../../build_system/lib/universal-darwin9-gcc40/libgcc.a -lSystem -lSystemStubs` 
+1

धन्यवाद, मुझे लगता है कि यह काम करेगा, लेकिन मुझे क्या हो रहा है इसके पीछे पृष्ठभूमि में दिलचस्पी है। – eeeeaaii

+0

मैकोज़ काफी लिनक्स नहीं है। यह मूल रूप से नेक्स्टोस है, आखिरकार। लिंकर थोड़ा विलक्षण है। Libtol में जोड़ें -v और यह आपको बताएगा कि यह क्या कर रहा है। – bmargulies

13

This thread भी इस मुद्दे पर चर्चा करता है। मुझे लगता है कि मुख्य बिंदु यह है कि लिनक्स की तरह लिंकिंग व्यवहार प्राप्त करने के लिए, आपको "-ंडीefined dynamic_lookup" ध्वज निर्दिष्ट करने की आवश्यकता है। डिफ़ॉल्ट रूप से, यदि गतिशील लाइब्रेरी में कोई अपरिभाषित संदर्भ हैं तो डार्विन लिंकर एक त्रुटि फेंकता है। आप इस व्यवहार को प्रति-प्रतीक आधार पर सेट करने के लिए भी उपयोग कर सकते हैं। संदर्भ के लिए 'आदमी एलडी' देखें।

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