2012-02-01 18 views
6

(हाँ, मैं समझता हूं कि डाइलीब का पूरा बिंदु यह है कि यह गतिशील रूप से लोड होता है, लेकिन मैं स्वयं निहित पैकेज बनाने की कोशिश कर रहा हूं।)क्या मैं अपने निष्पादन योग्य में dylib-s शामिल कर सकता हूं?

मुझे एक निष्पादन योग्य मिला है जिसे मैंने कमांड लाइन से बनाया है - - ओएस-एक्स/शेर पर, यदि यह मायने रखता है। मैंने निष्पादन योग्य को किसी मित्र को सौंप दिया, लेकिन वह इसे नहीं चला सकता क्योंकि उसके पास पुस्तकालय स्थापित नहीं हैं। वह लाइब्रेरी स्थापित नहीं करेगा, इसलिए अब मैं एक पैकेज बनाने की कोशिश कर रहा हूं जिसमें मूल निष्पादन योग्य प्लस सभी आवश्यक libs शामिल हैं।

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

धन्यवाद!

+0

क्या आप कृपया अर्नर्नर्ट के उत्तर को स्वीकार कर सकते हैं? इससे अन्य लोगों को यह पता चलने में मदद मिलेगी। यह मेरे लिए बहुत ही मददगार रहा। – Yitz

+0

हो गया। विलंब के लिए खेद है। – Olie

उत्तर

10

आप सीधे निष्पादन योग्य के अंदर एक डाइलिब नहीं डाल सकते हैं। (यह बहुत कुछ है कि बंडलों का आविष्कार किया गया था-लेकिन यह कमांड लाइन टूल्स के साथ आपकी मदद नहीं करता है।)

आप प्रत्येक डाइलिब को स्थैतिक (.a) लाइब्रेरी के रूप में पुनर्निर्माण कर सकते हैं, इस मामले में आपके कोड को निष्पादन योग्य जरूरतों को निष्पादन योग्य में कॉपी किया जाएगा, और आपको इसके साथ कुछ भी वितरित करने की आवश्यकता नहीं है। यदि आपको पुस्तकालयों का स्रोत मिल गया है, तो यह आमतौर पर बहुत आसान होता है-लेकिन यह जानने के बिना कि आप चीजों को कैसे बना रहे हैं, आपको यह बताना मुश्किल है कि क्या बदलना है।

स्थैतिक लिंकिंग के साथ ध्यान में रखना एक बात यह है कि इससे यह प्रभावित होता है कि विभिन्न लाइसेंस एक साथ कैसे खेलते हैं। विशेष रूप से, यदि आप जिन पुस्तकालयों का उपयोग कर रहे हैं वे एलजीपीएल-लाइसेंसीकृत हैं, तो उन्हें स्थिर करने से परिणामस्वरूप गतिशील लिंकिंग नहीं होती है। अधिक जानकारी के लिए this question (और उत्तर पर दिए गए लिंक) देखें, लेकिन वास्तव में, आपको लाइसेंस पर कानूनी सलाह के लिए स्टैक ओवरफ़्लो पर उत्तरों पर भरोसा नहीं करना चाहिए। वैसे भी, शायद यह ओपी के लिए कोई मुद्दा नहीं है "मैं एक कार्यक्रम बनाना चाहता हूं और इसे अपने दोस्त को देना चाहता हूं", लेकिन बाद में इस प्रश्न को पढ़ने वाले अन्य लोगों के लिए यह हो सकता है।

यदि स्थिर लिंकिंग संभव नहीं है या वांछनीय है, तो आपको केवल निष्पादन योग्य और dylibs को पैकेज करना होगा और उन्हें अपने मित्र की मशीन पर ले जाना होगा। चूंकि वह जाहिर तौर पर एक इंस्टॉलर चलाने के लिए नहीं चाहता है, इसका मतलब है कि एक टैरबॉल या ज़िपफाइल।

एकमात्र मुश्किल हिस्सा यह सुनिश्चित कर रहा है कि exe जानता है कि dylibs कहां मिलें। जब तक कि प्रत्येक डाइलीब या तो डायल सर्च पथ में नहीं है (अधिक जानकारी के लिए डाइल्ड के लिए मैनपेज देखें, लेकिन अगर आप कुछ भी इंस्टॉल नहीं करना चाहते हैं तो यह आपकी मदद नहीं करेगा), या उसी जगह में यह वही था जब आप उस समय थे इसे लिंक किया गया है, निष्पादन योग्य चल रहा है dyld से "छवि नहीं मिली" त्रुटि के साथ विफल हो जाएगा।

सौभाग्य से, "सटीक एक ही स्थान" का अर्थ "@ execableable_path/libfoo.dylib" जैसे जादू पथ का हो सकता है, जिसका अर्थ है "पूर्ण निर्देशिका जैसे" myexe "में,"/opt/local/lib /libfoo.dylib "या एक सापेक्ष पथ जैसे" ../../foo/build/Release/libfoo.dylib "।(ध्यान दें कि सामान्य संबंधित पथ वर्तमान कार्यशील निर्देशिका, नहीं निष्पादन योग्य या बंडल निर्देशिका के सापेक्ष हैं।)

आप देख सकते हैं जहां myexe ऐसा करके देख रहा है:

otool -L myexe 

कोई भी चीज जो में देख नहीं कर रहा है @ executable_path (सामान को छोड़कर/lib और/usr/lib, जो ओएस का हिस्सा है और वितरित करने के लिए की जरूरत नहीं है) में, आप इस तरह ठीक कर सकते हैं:

install_name_tool -change ../../../mydl/build/Release/libmydl.dylib @executable_path/libmydl.dylib myexe 

अब, आप बस सभी नकल करने की जरूरत है उन dylibs सही myexe के बगल में, इसे बंद करो, और इसे अपने दोस्त को देते हैं, और वह सिर्फ इसे हटा सकता है और exe चला सकते हैं।

+0

मुझे एक बात का उल्लेख करना चाहिए था लेकिन नहीं: यदि आप स्थिर libs का उपयोग करना चाहते हैं, तो आपको यह जांचना होगा कि लाइसेंस संगत हैं। मैं जवाब संपादित कर दूंगा। – abarnert

+1

पर स्पॉट - install_name_tool के संदर्भ में, आप इस तथ्य को याद कर रहे हैं कि आपको लाइन के अंत में निष्पादन योग्य के नाम की भी आवश्यकता है। – Damian

+0

@ डेमियन: अच्छा पकड़, धन्यवाद। जवाब संपादित किया। – abarnert

-1

मैक ओएस एक्स पर डाइलीब सामान्य रूप से "/ usr/local /" पर संग्रहीत होते हैं। डिफ़ॉल्ट रूप से सभी एप्लिकेशन "/ usr/local /" में किसी आवश्यक डिलिब की तलाश करते हैं।

विकल्प 1 आपके दोस्तों मशीनों// usr/local/"में dylibs रखना है।

विकल्प 2, डायलीब को उसी निष्पादन योग्य के रूप में उसी निर्देशिका में रखें।

विकल्प 3, एप्लिकेशन या डाइलिब में पथ को ठीक करें। XCode dylib looking in /usr/lib उपयोगी होगा। आप इस विकल्प का उपयोग dylibs को अपनी पसंद के स्थान पर पैकेज करने के लिए कर सकते हैं यानी एप्लिकेशन पैकेज के अंदर और बाहर दोनों।

+2

एप्लिकेशन/usr/local में dylibs की तलाश नहीं करते हैं। आप शायद/usr/स्थानीय/lib का मतलब है, लेकिन यहां तक ​​कि यह केवल आंशिक रूप से सटीक है। डाइल्ड पर मैनपेज बताता है कि वे कहां देखते हैं (विशेष रूप से DYLD_LIBRARY_PATH और DYLD_FALLBACK_LIBRARY_PATH देखें)। – abarnert