2010-10-17 11 views
6

मैं एक निष्पादन योग्य लिख रहा हूं जो साझा लाइब्रेरी को गतिशील रूप से लोड करने के लिए dlopen() (Windows पर LoadLibrary()) का उपयोग करता है। साझा लाइब्रेरी निष्पादन योग्य से प्रतीकों का उपयोग करता है।मैक: निष्पादन योग्य से प्रतीक कैसे निर्यात करें?

विंडोज़ में यह संभव है। निष्पादन योग्य प्रतीक निर्यात कर सकते हैं: declspec (dllexport) और .def फ़ाइलें दोनों काम करते हैं। .exe बनाते समय लिंकर, .lib फ़ाइल ("आयात लाइब्रेरी") भी बनाता है, इसलिए DLL को बस उस .lib से लिंक करने की आवश्यकता है।

लिनक्स में, यह भी संभव है। मैं निष्पादन योग्य बनाते समय -Wl, -export_dynamic पास करता हूं ताकि यह इसके प्रतीकों को निर्यात कर सके।

मैक ओएस एक्स पर, बजाय ... -Wl, -export_dynamic काम नहीं करता है, लेकिन -Wl, -exported_symbols_list, <filename> जहां <filename> (एक का एक सरल संस्करण के एक प्रकार के निर्यात करने के लिए प्रतीकों की एक सूची है है .def फ़ाइल)। लेकिन फिर, साझा लाइब्रेरी का निर्माण इतना आसान नहीं है: लिंकर अनसुलझे प्रतीकों के बारे में शिकायत करता है।

मैं एक हैक करने की कोशिश की: नाम बदलकर <executable> .dylib लिब और, जब शेयर की गई लाइब्रेरी जोड़ने, मैं -l <executable> पारित कर दिया करने के लिए निष्पादन योग्य। लेकिन यह त्रुटि "मुख्य निष्पादन योग्य से लिंक नहीं कर सकता" देता है।

सामान्य समस्या यह है कि लिनक्स साझा पुस्तकालयों में अनसुलझे प्रतीकों हो सकते हैं, जबकि विंडोज और मैक ओएस एक्स इसे अनुमति नहीं देते हैं। लेकिन विंडोज़ पर निर्भरता के खिलाफ प्रतीकों को हल करने के लिए "आयात पुस्तकालय" है, और मैक ओएस एक्स स्पष्ट रूप से नहीं है ...

यह मैक ओएस एक्स पर कैसे हल किया जा सकता है? क्या एक "आयात लाइब्रेरी" (एक .dll बनाते समय विंडोज लिंकर द्वारा बनाई गई स्टब लाइब्रेरी का समतुल्य है, इसलिए, यदि किसी मॉड्यूल को गतिशील रूप से .dll से लिंक करने की आवश्यकता है, तो यह "आयात लाइब्रेरी" के विरुद्ध जुड़ा हुआ है)? या कुछ अन्य समाधान?

उत्तर

5

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

env MACOSX_DEPLOYMENT_TARGET=10.3 gcc -bundle -undefined dynamic_lookup -o random.so lrandom.o 
+1

बीटीडब्ल्यू, "env MACOSX_DEPLOYMENT_TARGET = 10.3" 10.5 और उच्चतम के लिए आवश्यक नहीं है। – lhf

4

धन्यवाद, आपका जवाब बंडलों और dylibs के बीच अंतर की जांच के लिए इच्छा को प्रेरित किया। और ld मैनुअल पेज -bundle_loader निष्पादन

-bundle_loader नामक विकल्प का उल्लेख किया यह निष्पादन लोड हो रहा है हो जाएगा कि बंडल आउटपुट फ़ाइल जोड़ा जा रहा है निर्दिष्ट करता है। बंडल से अनिर्धारित प्रतीकों को निर्दिष्ट निष्पादन योग्य के खिलाफ चेक किया गया है जैसे कि गतिशील पुस्तकालयों में से एक बंडल से जुड़ा हुआ था।

(कि -bundle_loader जब एक dylib के निर्माण में विफल रहता है ध्यान दें, यह केवल बंडलों के साथ काम करता है) तो पुराने कमांड लाइन

cc -shared -o <output>.so <input>.c 

cc -bundle -bundle_loader <executable> -o <output>.so <input>.c 

में बदल गया था और उत्पादन बंडल निष्पादन योग्य के खिलाफ अपने अपरिभाषित प्रतीकों का समाधान किया।

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