2010-01-19 12 views
13

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

मुझे पता चला कि मैं otool का उपयोग अन्य डाइलिब्स के पथों को सूचीबद्ध या बदलने के लिए कर सकता हूं। यह एक फ़ोल्डर बनाने की अनुमति देगा जो मेरे प्लगइन एप्लिकेशन और सभी आवश्यक निर्भरताओं को बंडल करता है।

हालांकि, ऐसा करने से मैन्युअल रूप से समय लेने वाली और गूंगा कार्य लगता है। क्या स्वचालित करने के लिए उपयोगिताएं उपलब्ध हैं?

या शायद मैं इसे गलत कर रहा हूं और इस समस्या के लिए एक बेहतर और अधिक स्पष्ट दृष्टिकोण है?

संपादित करें मैंने script बनाया जो अधिकांश कार्य को स्वचालित करता है।

उत्तर

14

install_name_tool का उपयोग करके अपने dylib में सापेक्ष पथ का उपयोग करें। इस तरह आप उन्हें एक बार सेट कर सकते हैं, और उस निर्देशिका को इंस्टॉल समय पर अपने पुस्तकालयों को संशोधित करने की आवश्यकता के बिना कहीं भी इंस्टॉल कर सकते हैं।

आपको अपनी सभी डाइलिब निर्भरताओं को एक फ़ोल्डर में रखना चाहिए, फिर आप जिस अन्य dylibs पर निर्भर करते हैं उसके सापेक्ष स्थान को सेट करने के लिए install_name_tool का उपयोग करें। मान लीजिए कि आपके पुस्तकालय libmyfoo.dylib libbar.dylib पर निर्भर करता है:

install_name_tool -change "/Whatever/full/path/libbar.dylib" "@loader_path/libbar.dylib" libmyfoo.dylib 

इस तरह, अपने पुस्तकालय हमेशा एक ही निर्देशिका है जहाँ libmyfoo.dylib स्थित है में libbar.dylib के लिए दिखेगा।

यदि आप एक दूसरे पर निर्भर करते हैं, तो आपको कुछ अन्य dylibs पर install_name_tool चलाने की भी आवश्यकता हो सकती है।

खबरदार, install_name_tool के लिए दस्तावेज़ बताते हैं कि "इस उपकरण के लिए जब नाम स्थापित करने या rpaths बड़ा बाइनरी ld के साथ बनाया जाना चाहिए रहे हैं काम करने के लिए (1) विकल्प -headerpad_max_install_names।", इसलिए शामिल करना न भूलें आपकी लाइब्रेरी का निर्माण करते समय -headerpad_max_install_names कमांड लाइन विकल्प।

@loader_path इस मामले में आपके libmyfoo.dylib को डाइलिब लोड करने के लिए उपयोग की जाने वाली बाइनरी के सापेक्ष है। @executable_path का उपयोग करें यदि आप लाइब्रेरी लोडिंग अनुक्रम प्रारंभ करने वाले निष्पादन योग्य से संबंधित पुस्तकालयों को ढूंढना चाहते हैं।

+0

ध्यान रखें कि यह एक ऑटो-स्वीकृत बक्षीस उत्तर है। संभवतः यह वास्तव में प्रश्नकर्ता के मुद्दे को हल नहीं करता था। –

3

Macdylibbundler एक आसान छोटे से उपकरण है जो वास्तव में क्या करने के लिए कहा जाता है करता है। ओएसएक्स के लिए द्विआधारी वितरण करते समय यह निश्चित रूप से मेरे जीवन को बचाता है।

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