मैं एक निष्पादन योग्य लिख रहा हूं जो साझा लाइब्रेरी को गतिशील रूप से लोड करने के लिए 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 से लिंक करने की आवश्यकता है, तो यह "आयात लाइब्रेरी" के विरुद्ध जुड़ा हुआ है)? या कुछ अन्य समाधान?
बीटीडब्ल्यू, "env MACOSX_DEPLOYMENT_TARGET = 10.3" 10.5 और उच्चतम के लिए आवश्यक नहीं है। – lhf