सवाल स्रोत से चीजों को संकलित करना सीखना (यूनिक्स / लिनक्स / ओएसएक्स पर)


जबकि मैं संकुल (मैकपॉर्ट्स / एपीटी-गेट) से सॉफ़्टवेयर इंस्टॉल करता हूं, जहां भी संभव हो, मुझे अक्सर स्रोत से संकुल संकलित करने की आवश्यकता होती है। ./configure && make && sudo make install आमतौर पर पर्याप्त होता है, लेकिन कभी-कभी यह काम नहीं करता है - और जब ऐसा नहीं होता है, तो मैं अक्सर अटक जाता हूं। यह लगभग हमेशा किसी अन्य तरीके से अन्य लाइब्रेरी निर्भरताओं से संबंधित है।

मैं निम्नलिखित सीखना चाहता हूं:

  • मैं कैसे पता लगा सकता हूं कि किस तर्क को पारित करना है ./configure?
  • कैसे साझा पुस्तकालय ओएस एक्स / लिनक्स के तहत काम करते हैं - जहां वे फाइल सिस्टम पर रहते हैं, कैसे ./configure && make उन्हें पाता है, वास्तव में क्या होता है जब वे जुड़े होते हैं
  • साझा और स्थैतिक रूप से जुड़ी लाइब्रेरी के बीच वास्तविक अंतर क्या हैं? मैं बस सब कुछ स्थिर रूप से लिंक क्यों नहीं कर सकता (राम और डिस्क स्थान इन दिनों सस्ते हैं) और इसलिए अजीब लाइब्रेरी संस्करण संघर्ष से बचें?
  • मैं कैसे बता सकता हूं कि मैंने कौन से पुस्तकालय स्थापित किए हैं, और कौन से संस्करण हैं?
  • मैं अपने सामान्य सिस्टम को तोड़ने के बिना पुस्तकालय के एक से अधिक संस्करण कैसे स्थापित कर सकता हूं?
  • अगर मैं कर रहा हूँ किसी ऐसे सिस्टम पर स्रोत से सामान स्थापित करना जो अन्यथा संकुल का उपयोग करके प्रबंधित किया जाता है, ऐसा करने का सबसे साफ तरीका क्या है?
  • मान लीजिए कि मैं स्रोत से कुछ हद तक संकलित करने का प्रबंधन करता हूं, फिर मैं इसे कैसे पैकेज कर सकता हूं ताकि अन्य लोगों को एक ही हुप्स से कूदना पड़े? विशेष रूप से ओएस एक्स पर ....
  • इस सामान पर अच्छा पाने के लिए मुझे कमांड लाइन टूल्स की आवश्यकता है? ओटोल, पीकेजी-कॉन्फ़िगर इत्यादि जैसी सामग्री

मैं यहां थोड़ा सा समय और प्रयास निवेश करने के लिए तैयार हूं - मुझे जरूरी नहीं कि उपरोक्त प्रश्नों के सीधा जवाब चाहिए, मुझे किताबों / ट्यूटोरियल / एफएक्यू पर सिफारिशें मिलेंगी जो मैं पढ़ सकता हूं जो मुझे देगी ज्ञान मुझे समझने की जरूरत है कि वास्तव में क्या चल रहा है और इसलिए स्वयं को समस्याएं आती हैं।


45
2017-07-27 08:48


मूल




जवाब:


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

1. मैं कैसे पता लगा सकता हूं कि ./configure को पास करने के लिए कौन से तर्क हैं?

वास्तव में अभ्यास करें। ऑटोटूल काफी आसान है क्योंकि यह सुसंगत है। लेकिन cmake, या कस्टम बिल्ड स्क्रिप्ट का उपयोग कर वहाँ बहुत सारी चीजें हैं। आम तौर पर, आपको कॉन्फ़िगर करने के लिए कुछ भी पास नहीं करना चाहिए, यह पता लगाना चाहिए कि क्या आपका सिस्टम foo-tool बना सकता है या नहीं।

कॉन्फ़िगर करें और जीएनयू उपकरण सभी निर्भरताओं के लिए /, / usr और / usr / स्थानीय में देखें। यदि आप कहीं और कुछ भी इंस्टॉल करते हैं (जो मैकपॉर्ट्स या फ़िंक द्वारा निर्भरता स्थापित किया गया था, तो चीजों को दर्दनाक बनाता है), आपको इन निर्भरताओं को ढूंढने में जीएनयू टूल्स की सहायता के लिए शैल के पर्यावरण को कॉन्फ़िगर या संशोधित करने के लिए ध्वज पास करना होगा।

2. ओएस एक्स / लिनक्स के तहत पुस्तकालय कैसे काम करते हैं - जहां वे फाइल सिस्टम पर रहते हैं, कैसे ./configure && उन्हें पाता है, वास्तव में क्या होता है जब वे इसके खिलाफ जुड़े होते हैं

लिनक्स पर उन्हें उस पथ पर स्थापित करने की आवश्यकता है जिसे गतिशील लिंकर मिल सकता है, इसे परिभाषित किया गया है LD_LIBRARY_PATHपर्यावरण चर और /etc/ld.conf की सामग्री। मैक पर यह लगभग हमेशा ओपन सोर्स सॉफ़्टवेयर के लिए समान होता है (जब तक कि यह एक एक्सकोड प्रोजेक्ट न हो)। एनवी चर के अलावा है DYLD_LIBRARY_PATH बजाय।

एक डिफ़ॉल्ट पथ है जो लिंकर पुस्तकालयों की खोज करता है। यह / lib है: / usr / lib: / usr / local / lib

आप सीपीएटीएच वैरिएबल, या सीएफएलएजीएस या किसी भी अन्य पर्यावरण चर का उपयोग करके इसे पूरक कर सकते हैं (वास्तव में जटिल)। मैं इस प्रकार CFLAGS का सुझाव देते हैं:

निर्यात CFLAGS = "$ CFLAGS -L / नया / पथ"

-एल पैरामीटर लिंक पथ में जोड़ता है।

आधुनिक सामान pkg-config उपकरण का उपयोग करता है। आपके द्वारा इंस्टॉल की जाने वाली आधुनिक सामग्री भी एक .pc फ़ाइल स्थापित करती है जो लाइब्रेरी का वर्णन करती है और यह कहां है और उससे कैसे लिंक करें। यह जीवन को आसान बना सकता है। लेकिन यह ओएस एक्स 10.5 के साथ नहीं आता है, इसलिए आपको इसे भी इंस्टॉल करना होगा। इसके अलावा बहुत सारे मूल डिप्टी इसका समर्थन नहीं करते हैं।

लिंकिंग का कार्य सिर्फ "रनटाइम पर इस फ़ंक्शन को हल करें", वास्तव में यह एक बड़ी स्ट्रिंग तालिका है।

3. साझा और स्थैतिक रूप से जुड़ी लाइब्रेरी के बीच वास्तविक अंतर क्या हैं? मैं बस सब कुछ स्थिर रूप से लिंक क्यों नहीं कर सकता (राम और डिस्क स्थान इन दिनों सस्ते हैं) और इसलिए अजीब लाइब्रेरी संस्करण संघर्ष से बचें?

जब आप किसी स्थिर लाइब्रेरी फ़ाइल से लिंक करते हैं तो कोड आपके एप्लिकेशन का हिस्सा बन जाता है। ऐसा लगता है कि उस लाइब्रेरी के लिए एक विशाल .c फ़ाइल थी और आपने इसे अपने एप्लिकेशन में संकलित किया था।

गतिशील पुस्तकालयों में एक ही कोड होता है, लेकिन जब ऐप चलाया जाता है, तो कोड को रनटाइम (सरलीकृत स्पष्टीकरण) पर ऐप में लोड किया जाता है।

आप सबकुछ स्थिर रूप से लिंक कर सकते हैं, हालांकि, दुख की बात है कि कोई भी बिल्ड सिस्टम इसे आसान बनाता है। आपको मैन्युअल रूप से बिल्ड सिस्टम फ़ाइलों को संपादित करना होगा (उदाहरण के लिए Makefile.am, या CMakeLists.txt)। हालांकि यह शायद सीखने लायक है यदि आप नियमित रूप से उन चीजों को स्थापित करते हैं जिन्हें पुस्तकालयों के विभिन्न संस्करणों की आवश्यकता होती है और आप समानांतर कठिनाई में निर्भरता स्थापित कर रहे हैं।

चाल लिंक लाइन को -lfoo से -l / path / to / static / foo.a में बदलने के लिए है

आप शायद ढूंढ और प्रतिस्थापित कर सकते हैं। बाद में उपकरण को ldd foo या otool -L foo का उपयोग करके .so या dylib से लिंक नहीं करता है

एक और समस्या यह है कि सभी पुस्तकालय स्थिर पुस्तकालयों के लिए संकलित नहीं हैं। बहुत से लोग करते हैं। लेकिन फिर मैकपॉर्ट्स या डेबियन ने इसे शिप करने का फैसला नहीं किया होगा।

4. मैं कैसे बता सकता हूं कि मैंने कौन से पुस्तकालय स्थापित किए हैं, और कौन से संस्करण हैं?

यदि आपके पास उन पुस्तकालयों के लिए pkg-config फ़ाइलें हैं तो यह आसान है:

pkg-config --list-all

अन्यथा आप अक्सर आसानी से नहीं कर सकते हैं। डाइलीब में एक soname हो सकता है (यानी foo.0.1.dylib, soname 0.1 है) जो पुस्तकालय के संस्करण के समान है। हालांकि यह आवश्यक नहीं है। सोनम एक बाइनरी कम्प्यूटेबिलिटी फीचर है, यदि आप लाइब्रेरी में फ़ंक्शंस के प्रारूप को बदलते हैं तो आपको सोनम के प्रमुख हिस्से को टक्कर देना होगा। तो आप उदाहरण प्राप्त कर सकते हैं। एक 2.0 पुस्तकालय के लिए संस्करण 14.0.5 soname। हालांकि यह आम नहीं है।

मैं इस तरह की चीज़ से निराश हो गया और मैक पर इसके लिए एक समाधान विकसित किया है, और मैं इसके बारे में बात कर रहा हूं।

5. मैं अपने सामान्य सिस्टम को तोड़ने के बिना पुस्तकालय के एक से अधिक संस्करण कैसे स्थापित कर सकता हूं?

इसका मेरा समाधान यहां है: http://github.com/mxcl/homebrew/

मुझे स्रोत से इंस्टॉल करना पसंद है, और एक उपकरण चाहता था जिसने इसे आसान बना दिया, लेकिन कुछ पैकेज प्रबंधन के साथ। तो होमब्रू मैं निर्माण के साथ, उदाहरण के लिए। स्रोत से खुद को भूल जाओ, लेकिन एक विशेष उपसर्ग में स्थापित करना सुनिश्चित करें:

/usr/local/Cellar/wget/1.1.4

मैं फिर होमब्रू उपकरण का उपयोग उन सभी को / usr / local में सिंक्रनाइज़ करने के लिए करता हूं, इसलिए मेरे पास अभी भी / usr / local / bin / wget और /usr/local/lib/libwget.dylib है

बाद में अगर मुझे wget के एक अलग संस्करण की आवश्यकता है तो मैं इसे समानांतर में स्थापित कर सकता हूं और केवल उस संस्करण को बदल सकता हूं जो / usr / स्थानीय पेड़ में जुड़ा हुआ है।

6. अगर मैं किसी ऐसे सिस्टम पर स्रोत से सामान इंस्टॉल कर रहा हूं जो अन्यथा संकुल का उपयोग करके प्रबंधित किया जाता है, तो ऐसा करने का सबसे साफ तरीका क्या है?

मेरा मानना ​​है कि होमब्रू रास्ता सबसे साफ है, इसलिए इसका इस्तेमाल करें या समकक्ष करें। / Usr / local / pkgs / name / version और symlink या बाकी में हार्ड लिंक को इंस्टॉल करें।

उपयोग / usr / स्थानीय उपयोग करें। निर्भरता और शीर्षलेखों के लिए वहां मौजूद प्रत्येक निर्माण उपकरण मौजूद है। आपका जीवन होगा बहुत आसान।

7. मान लीजिए कि मैं स्रोत से कुछ हद तक संकलित करने का प्रबंधन करता हूं, फिर मैं इसे कैसे पैकेज कर सकता हूं ताकि अन्य लोगों को एक ही हुप्स से कूदना पड़े? विशेष रूप से ओएस एक्स पर ....

यदि इसकी कोई निर्भरता नहीं है तो आप बिल्ड निर्देशिका को टैर कर सकते हैं और इसे किसी और को दे सकते हैं जो "इंस्टॉल करें" कर सकता है। हालांकि आप ओएस एक्स के सटीक संस्करणों के लिए केवल यह भरोसेमंद कर सकते हैं। लिनक्स पर यह संभवतः उसी कर्नेल संस्करण और libc मामूली संस्करण के साथ समान लिनक्स (उदाहरण के लिए उबंटू) के लिए काम करेगा।

यूनिक्स पर द्विआधारी वितरित करना आसान नहीं है क्योंकि बाइनरी संगतता की वजह से है। जीएनयू लोग, और हर कोई अक्सर अपने बाइनरी इंटरफेस बदलता है।

मूल रूप से बाइनरी वितरित नहीं करते हैं। चीजें शायद बहुत अजीब तरीकों से तोड़ देंगे।

मैक पर, मैकपोर्ट पैकेज बनाने का सबसे अच्छा विकल्प है। हर कोई मैकपोर्ट का उपयोग करता है। लिनक्स पर कई अलग-अलग बिल्ड सिस्टम और संयोजन हैं, मुझे नहीं लगता कि ब्लॉग एंट्री लिखने की तुलना में कोई बेहतर सलाह है कि आप वाई अजीब कॉन्फ़िगरेशन में एक्स टूल बनाने में सफल कैसे हुए।

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

होमब्रू के साथ मेरे भविष्य के लक्ष्यों में से एक वेबसाइट पर एक लिंक पर क्लिक करना संभव है (उदाहरण के लिए होमब्रे: // ब्लाह और यह रूबी स्क्रिप्ट डाउनलोड करेगा, उस पैकेज के लिए डीपी इंस्टॉल करें और फिर ऐप बनाएं। लेकिन हाँ, अभी तक नहीं किया गया है, लेकिन मैंने जो डिज़ाइन चुना है, उससे बहुत मुश्किल नहीं है।

8. इस सामान पर अच्छा पाने के लिए मुझे कमांड लाइन टूल्स की आवश्यकता है? ओटोल, पीकेजी-कॉन्फ़िगर इत्यादि जैसी सामग्री

otool वास्तव में बाद में केवल उपयोगी है। यह आपको बताता है कि निर्मित बाइनरी लिंक क्या है। जब आप किसी उपकरण की निर्भरताओं को समझ रहे हैं जिसे आप बनाना चाहते हैं, तो यह बेकार है। पीकेजी-कॉन्फ़िगरेशन के बारे में भी यही सच है क्योंकि आप इसे उपयोग करने से पहले निर्भरता पहले ही स्थापित कर चुके हैं।

मेरी टूल श्रृंखला है, रीडमी पढ़ें और फ़ाइलों को इंस्टॉल करें, और एक कॉन्फ़िगर करें --help। इसे देखने के लिए बिल्ड आउटपुट देखें। किसी भी निर्माण त्रुटियों को पार्स करें। शायद भविष्य में, serverfault पर पूछें :)


38
2017-07-27 13:08



दिलचस्प, होमब्रू पोर्टेज (जेनेटू लिनक्स से पैकेज मैनेजर) की तरह दिखता है। काम के एक अच्छे टुकड़े की तरह लगता है। - David Z


यह एक बड़ा विषय है इसलिए लिनक्स पर साझा पुस्तकालयों (लिनक्स पर ईएलएफ और ओएस एक्स पर मैक-ओ) के साथ शुरू करते हैं, Ulrich Drepper के पास अच्छा है डीएसओ लिखने के लिए परिचय (गतिशील साझा वस्तुओं) जो यहां उपलब्ध लिनक्स पर साझा पुस्तकालयों के कुछ इतिहास को शामिल करता है, जिसमें वे महत्वपूर्ण हैं

Ulrich भी क्यों वर्णन करता है स्थैतिक लिंकिंग हानिकारक माना जाता है यहां प्रमुख बिंदुओं में से एक सुरक्षा अद्यतन है। बफर ओवरफ्लो एक सामान्य लाइब्रेरी (जैसे zlib) में जो व्यापक रूप से जुड़ा हुआ है, वितरण के लिए एक विशाल ओवरहेड का कारण बन सकता है - यह zlib 1.1.3 के साथ हुआ (रेड हैट सलाहकार)

ELF

लिंकर ld.so मैनुअल पेज

man ld.so 

रनटाइम गतिशील लिंकिंग में शामिल बुनियादी पथ और फ़ाइलों को बताता है। आधुनिक लिनक्स सिस्टम पर आपको /etc/ld.so.conf.d/ के माध्यम से जोड़े गए अतिरिक्त पथ दिखाई देंगे, आमतौर पर / glc/ld.so.conf में एक ग्लोब के माध्यम से जोड़ा जाता है।

यदि आप देखना चाहते हैं कि आपके ld.so कॉन्फ़िगरेशन के माध्यम से गतिशील रूप से क्या उपलब्ध है, तो आप चला सकते हैं

ldconfig -v -N -X

डीएसओ को पढ़ना आपको यह समझने के लिए कि कैसे वे सिद्धांत ओएस एक्स पर मैक-ओ पर लागू होते हैं, समझने के लिए ज्ञान का एक अच्छा बुनियादी स्तर प्रदान करना चाहिए।

मच-ओ

ओएस एक्स पर बाइनरी प्रारूप मैक-ओ है। लिंकर के लिए स्थानीय सिस्टम दस्तावेज है

man dyld

मैक प्रारूप प्रलेखन ऐप्पल से उपलब्ध है

यूनिक्स बिल्ड टूल्स

सामान्य configure, make, make install प्रक्रिया आमतौर पर जीएनयू ऑटोोटूल द्वारा प्रदान की जाती है जिसमें एक है ऑनलाइन किताब जिसमें कॉन्फ़िगर / बिल्ड स्प्लिट और जीएनयू टूलचेन के कुछ इतिहास शामिल हैं। autoconf लक्ष्य निर्माण प्रणाली पर सुविधा उपलब्धता निर्धारित करने के लिए परीक्षणों का उपयोग करता है, यह उपयोग करता है एम 4 मैक्रो भाषा इसे चलाने के लिए। automake मूल रूप से मेकफ़ाइल के लिए एक टेम्पलेटिंग विधि है, टेम्पलेट को आम तौर पर Makefile.am कहा जाता है जो एक Makefile.in आउटपुट करता है कि autoconf (कॉन्फ़िगर स्क्रिप्ट) का आउटपुट मेकफ़ाइल में परिवर्तित हो जाता है।

जीएनयू हैलो कार्यक्रम जीएनयू टूलचैन को समझने के लिए एक अच्छा उदाहरण के रूप में कार्य करता है - और मैनुअल में autotools दस्तावेज़ शामिल हैं।


11
2017-07-27 09:18





साइमन! मैं जानता हूं कि तुम कैसा महसूस करते हो; मैं लिनक्स सीखने के इस हिस्से के साथ भी संघर्ष कर रहा था। अपने अनुभवों के आधार पर, मैंने आपके द्वारा संबोधित कुछ वस्तुओं के बारे में एक ट्यूटोरियल लिखा (ज्यादातर मेरे लिए संदर्भ के रूप में!): http://easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html। मुझे लगता है कि आप मेरे नोट की सराहना करेंगे कि पाइथन अनुप्रयोगों को कितना आसान बनाना / इंस्टॉल करना है। :)

उम्मीद है कि यह मदद करता है! और खुश संकलन।

टिम जोन्स


उबंटू लिनक्स में स्रोत से एप्लिकेशन इंस्टॉल / इंस्टॉल करना

जबकि उबंटू रिपॉजिटरीज बहुत अच्छे अनुप्रयोगों से भरा हुआ है, एक समय या दूसरे में आप उस "जरूरी" उपकरण में आने वाले हैं जो रिपॉजिटरीज़ में नहीं है (या डेबियन पैकेज नहीं है) या आपको एक की आवश्यकता है भंडारों की तुलना में नया संस्करण। आप क्या करते हैं? खैर, आपको स्रोत से आवेदन बनाना होगा! चिंता न करें, यह वास्तव में उतना ही जटिल नहीं है जितना लगता है। रैंक शौकिया होने से होने के अपने अनुभवों के आधार पर कुछ सुझाव यहां दिए गए हैं! (हालांकि मैं इस उदाहरण के लिए उबंटू का उपयोग कर रहा हूं, सामान्य अवधारणाएं किसी भी यूनिक्स / लिनक्स वितरण, जैसे कि फेडोरा, और यहां तक ​​कि विंडोज़ पर सिग्विन मंच पर भी लागू होनी चाहिए।)

स्रोत से अधिकतर अनुप्रयोगों (संकलन) की मूल प्रक्रिया इस अनुक्रम का पालन करती है: कॉन्फ़िगर करें -> संकलित करें -> इंस्टॉल करें। इन चीजों को करने के लिए सामान्य यूनिक्स / लिनक्स कमांड हैं: config -> make -> make install। कुछ मामलों में, आपको वेब पेज भी मिलेंगे जो दिखाते हैं कि इन सभी को एक ही कमांड में जोड़ा जा सकता है:

$ config && make && make install

बेशक, यह आदेश मानता है कि इनमें से किसी भी चरण में कोई समस्या नहीं है। यह वह जगह है जहां मजा आता है!

शुरू करना

यदि आपने पहले अपने सिस्टम पर स्रोत से कोई एप्लिकेशन संकलित नहीं किया है, तो आपको शायद इसे कुछ सामान्य विकास टूल, जैसे कि gcc कंपाइलर सूट, कुछ सामान्य हेडर फाइलें (इस कोड के बारे में सोचें जो पहले से ही किसी अन्य व्यक्ति द्वारा लिखी गई है जिसे आप इंस्टॉल कर रहे प्रोग्राम द्वारा उपयोग किया जाता है), और मेक टूल। सौभाग्य से, उबंटू में, एक मेटापैक कहा जाता है build-essential यह इस स्थापित करेगा। इसे स्थापित करने के लिए (या बस सुनिश्चित करें कि आपके पास पहले से ही है!), टर्मिनल में यह आदेश चलाएं:

$ sudo apt-get install build-essential

अब जब आपके पास मूल सेटअप है, तो एप्लिकेशन स्रोत फ़ाइलों को डाउनलोड करें और उन्हें उस निर्देशिका में सहेजें जिसके लिए आपने अपनी "होम" निर्देशिका जैसे पढ़ने / लिखने की अनुमतियां पढ़ी हैं। आम तौर पर, ये किसी भी फ़ाइल फ़ाइल के साथ एक संग्रह फ़ाइल में होंगे .tar.gz या .tar.bz2.tar इसका मतलब है कि यह एक "टेप संग्रह" है, जो फाइलों का समूह है जो उनकी सापेक्ष निर्देशिका संरचना को संरक्षित करता है। .gz gzip (जीएनयू ज़िप) के लिए खड़ा है, जो एक लोकप्रिय यूनिक्स / लिनक्स संपीड़न प्रारूप है। इसी तरह, .bz2 bzip2 के लिए खड़ा है, जो एक नया संपीड़न प्रारूप है जो gzip की तुलना में उच्च संपीड़न (छोटा संकुचित फ़ाइल आकार) प्रदान करता है।

स्रोत फ़ाइल डाउनलोड करने के बाद, टर्मिनल विंडो (उबंटू मेनू से सिस्टम टर्मिनल) खोलें और उस निर्देशिका में बदलें जहां आपने अपनी फ़ाइल सहेजी थी। (मैं उपयोग करूंगा ~/download इस उदाहरण में। यहां, '~' आपकी "होम" निर्देशिका का शॉर्टकट है।) डाउनलोड की गई फ़ाइल फ़ाइल से फ़ाइलों को निकालने के लिए टैर कमांड का उपयोग करें:

यदि आपकी फ़ाइल एक gzip संग्रह है (उदा।, समाप्त होता है .tar.gz), आदेश का प्रयोग करें:

            $ tar -zxvf filename.tar.gz

अगर आपकी फ़ाइल एक bzip2 संग्रह है (उदा।, समाप्त होता है .tar.bz2), आदेश का प्रयोग करें:

            $ tar -jxvf filename.tar.gz

युक्ति: यदि आप नहीं करना चाहते हैं   सभी कमांड लाइन याद रखें   अभिलेखागार निकालने के लिए स्विच, मैं   एक (या दोनों) प्राप्त करने की सलाह देते हैं   इन उपयोगिताओं: डीआरटीएक्स (मेरा पसंदीदा!)   या डेको (अधिक लोकप्रिय)। इनमें से किसी के साथ   इन उपयोगिताओं, आप बस दर्ज करें   उपयोगिता का नाम (डीआरटीएक्स या डेको) और   फ़ाइल नाम, यह सब करता है   आराम। इन दोनों को "पता" कैसे करें   अधिकांश संग्रह प्रारूप को संभाल लें   आप दौड़ने की संभावना है और वे   महान त्रुटि हैंडलिंग है।

स्रोत से निर्माण करते समय, दो सामान्य प्रकार की त्रुटियां होती हैं जिनकी आपको सामना करना पड़ सकता है:

  1. कॉन्फ़िगरेशन त्रुटियां तब होती हैं जब आप कॉन्फ़िगरेशन स्क्रिप्ट (आमतौर पर नाम कॉन्फ़िगर या कॉन्फ़िगर) चलाते हैं ताकि आपके सेटअप के लिए विशिष्ट मेकफ़ाइल बनाया जा सके।
  2. कंपाइलर त्रुटियां तब होती हैं जब आप मेक कमांड चलाते हैं (मेकफ़ाइल उत्पन्न होने के बाद) और कंपाइलर कुछ कोड ढूंढने में असमर्थ है।

हम इनमें से प्रत्येक को देखेंगे और चर्चा करेंगे कि उन्हें कैसे हल किया जाए।

विन्यास और विन्यास त्रुटियां

टर्मिनल में, स्रोत कोड संग्रह फ़ाइल निकालने के बाद, आपको उस निर्देशिका में बदलना चाहिए जिसमें निकाली गई फ़ाइलें हों। आम तौर पर, यह निर्देशिका नाम फ़ाइल के नाम के समान होगा (बिना .tar.gz या .tar.bz2 विस्तार)। हालांकि, कभी-कभी निर्देशिका नाम किसी भी संस्करण की जानकारी के बिना, एप्लिकेशन का नाम है।

स्रोत निर्देशिका में एक के लिए देखो README फ़ाइल और / या एक INSTALL फ़ाइल (या समान नामों वाला कुछ)। इन फ़ाइलों में आम तौर पर अनुप्रयोगों को बनाने / संकलित करने और निर्भरताओं के बारे में जानकारी सहित इसे स्थापित करने के बारे में उपयोगी जानकारी होती है। "निर्भरता" अन्य घटकों या पुस्तकालयों के लिए केवल एक फैंसी नाम है जो सफलतापूर्वक संकलित करने के लिए आवश्यक हैं।

पढ़ने के बाद README और / या INSTALL फ़ाइल (और, आशा है कि एप्लिकेशन के लिए किसी भी प्रासंगिक ऑनलाइन दस्तावेज को देखा जाए), निष्पादन योग्य की तलाश करें (फ़ाइल पर "x" अनुमति सेट है) फ़ाइल नाम config या configure। कभी-कभी फ़ाइल में एक एक्सटेंशन हो सकता है, जैसे कि .sh (जैसे, config.sh)। यह आमतौर पर एक शेल स्क्रिप्ट होती है जो यह पुष्टि करने के लिए कुछ अन्य उपयोगिताओं को चलाती है कि आपके पास संकलन के लिए "साने" वातावरण है। दूसरे शब्दों में, यह सुनिश्चित करने के लिए जांच करेगा कि आपके पास आवश्यक सबकुछ स्थापित है।

युक्ति: यदि यह एक पायथन आधारित है   एक विन्यास फाइल के बजाय आवेदन,   आपको नाम की एक फ़ाइल मिलनी चाहिए setup.py।   पायथन अनुप्रयोग आमतौर पर बहुत हैं   स्थापित करने के लिए सरल है। इसे स्थापित करने के लिए   एप्लिकेशन, रूट के रूप में (उदा।, सूडो डाल दें   निम्नलिखित कमांड के सामने   उबंटू के तहत), इस आदेश को चलाएं:

    $ python setup.py install

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

टर्मिनल में कॉन्फ़िगरेशन स्क्रिप्ट चलाएं। आम तौर पर, आप अपने नियमित उपयोगकर्ता खाते के साथ अपनी कॉन्फ़िगरेशन स्क्रिप्ट चला सकते हैं (और चाहिए!)।

$ ./config

स्क्रिप्ट आपको कुछ संदेश प्रदर्शित करेगी ताकि आपको यह पता चल सके कि यह क्या कर रहा है। प्रायः, स्क्रिप्ट आपको यह संकेत देगा कि यह सफल हुआ या असफल रहा और यदि विफल हो गया, तो विफलता के कारण के बारे में कुछ जानकारी। अगर आपको कोई त्रुटि संदेश नहीं मिलता है, तो आप आमतौर पर यह मान सकते हैं कि सब कुछ ठीक हो गया है।

अगर आपको कॉन्फ़िगरेशन स्क्रिप्ट की तरह कोई स्क्रिप्ट नहीं मिलती है, तो इसका आमतौर पर मतलब है कि एप्लिकेशन एक बहुत ही सरल है और यह प्लेटफार्म स्वतंत्र है। इसका मतलब यह है कि आप प्रदान किए गए निर्माण के बजाय नीचे दिए गए निर्माण / संकलन चरण पर जा सकते हैं Makefileकिसी भी प्रणाली पर काम करना चाहिए।

एक उदाहरण

इस ट्यूटोरियल में, मैं टेक्स्ट-आधारित आरएसएस रीडर का उपयोग न्यूज़बीटर नामक त्रुटियों के प्रकार के उदाहरण के रूप में करने के लिए कर रहा हूं, जो आपके आवेदन के निर्माण के दौरान आपको मिल सकती हैं। न्यूजबीटर के लिए, कॉन्फ़िगरेशन स्क्रिप्ट का नाम है config.sh। मेरे सिस्टम पर, जब मैं दौड़ता हूं config.sh, निम्नलिखित त्रुटियां होती हैं:

tester@sitlabcpu22:~/download/newsbeuter-1.3$ ./config.sh
Checking for package sqlite3... not found

You need package sqlite3 in order to compile this program.
Please make sure it is installed.

कुछ शोध करने पर, मैंने पाया कि, वास्तव में, sqlite3 आवेदन स्थापित किया गया था। हालांकि, चूंकि मैं स्रोत से निर्माण करने की कोशिश कर रहा हूं, यह एक टिप है कि क्या config.sh वास्तव में विकास पुस्तकालयों (शीर्षलेख) के लिए देख रहे हैं sqlite3। उबंटू में, अधिकांश पैकेजों में एक संबंधित विकास समकक्ष पैकेज होता है जो समाप्त होता है -dev। (फेडोरा जैसे अन्य प्लेटफॉर्म, अक्सर पैकेज प्रत्यय का उपयोग करते हैं -devel विकास पैकेज के लिए।)

के लिए उपयुक्त पैकेज खोजने के लिए sqlite3 विकास पैकेज, हम इसका उपयोग कर सकते हैं apt-cache उबंटू में उपयोगिता (और, इसी तरह, yum फेडोरा में उपयोगिता):

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite

यह आदेश परिणाम की एक बड़ी सूची देता है, इसलिए हमें उचित पैकेज कौन सा निर्धारित करने के लिए थोड़ा सा जासूसी कार्य करना है। इस मामले में, उपयुक्त पैकेज हो जाता है libsqlite3-dev। ध्यान दें कि कभी-कभी जिस पैकेज को हम ढूंढ रहे हैं वह होगा lib उपसर्ग, केवल उसी पैकेज नाम के बजाय प्लस -dev। ऐसा इसलिए होता है क्योंकि कभी-कभी हम केवल एक साझा लाइब्रेरी की तलाश में हैं जो कई अलग-अलग अनुप्रयोगों द्वारा उपयोग किया जा सकता है। स्थापित करने के लिए libsqlite3-devटर्मिनल में सामान्य apt-get install कमांड चलाएं:

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev

अब, हमें दौड़ना है config.sh यह सुनिश्चित करने के लिए कि हमने इस निर्भरता की समस्या का समाधान किया है और हमारे पास कोई और निर्भरता समस्या नहीं है। (हालांकि, मैं इसे यहां नहीं दिखाऊंगा, न्यूजबीटर के मामले में, मुझे भी इसे स्थापित करना पड़ा libcurl4-openssl-dev पैकेज, साथ ही।) इसके अलावा, यदि आप एक विकास पैकेज स्थापित करते हैं (जैसे libsqlite3-dev) और संबंधित अनुप्रयोग पैकेज (उदा। sqlite3) पहले से स्थापित नहीं है, अधिकांश सिस्टम स्वचालित रूप से एक ही समय में संबंधित अनुप्रयोग पैकेज स्थापित करेंगे।

जब कॉन्फ़िगरेशन सफलतापूर्वक चलता है, तो परिणाम यह होगा कि यह एक या अधिक फ़ाइलों को बनाएगा। इन फ़ाइलों को आम तौर पर नामित किया जाता है Makefile (याद रखें कि फ़ाइल नाम केस यूनिक्स / लिनक्स में मायने रखता है!)। यदि निर्माण पैकेज में उप-निर्देशिकाएं शामिल हैं, जैसे कि src, आदि, इन उप-निर्देशिकाओं में से प्रत्येक में एक होगा Makefile, भी।

बिल्डिंग और संकलन त्रुटियां

अब, हम वास्तव में आवेदन संकलित करने के लिए तैयार हैं। इसे अक्सर इमारत कहा जाता है और नाम कुछ बनाने के वास्तविक दुनिया की प्रक्रिया से उधार लिया जाता है। एप्लिकेशन के विभिन्न "टुकड़े", जो आम तौर पर एकाधिक स्रोत कोड फाइल होते हैं, समग्र अनुप्रयोग बनाने के लिए एक साथ संयुक्त होते हैं। मेक यूटिलिटी बिल्ड प्रक्रिया को प्रबंधित करती है और वास्तव में काम करने के लिए कंपाइलर और लिंकर जैसे अन्य अनुप्रयोगों को कॉल करती है। ज्यादातर मामलों में, आप बस निर्देशिका से (अपने नियमित उपयोगकर्ता खाते के साथ) चलाते हैं जहां आपने कॉन्फ़िगरेशन चलाया था। (कुछ मामलों में, जैसे कि क्यूटी लाइब्रेरी के साथ लिखे गए अनुप्रयोगों को संकलित करने के लिए, आपको इसके बजाय क्यूमेक जैसे अन्य "रैपर" एप्लिकेशन को चलाने की आवश्यकता होगी। फिर, हमेशा जांचें README और / या INSTALLविवरण के लिए दस्तावेज।)

ऊपर कॉन्फ़िगरेशन स्क्रिप्ट के साथ, जब आप टर्मिनल में (या समान उपयोगिता) चलाते हैं, तो यह निष्पादन और किसी भी चेतावनी और त्रुटियों के बारे में कुछ संदेश प्रदर्शित करेगा। आप आमतौर पर चेतावनियों को अनदेखा कर सकते हैं, क्योंकि वे मुख्य रूप से एप्लिकेशन के डेवलपर्स के लिए हैं और उन्हें बता रहे हैं कि कुछ मानक प्रथाओं का उल्लंघन किया जा रहा है। आमतौर पर, ये चेतावनियां अनुप्रयोग फ़ंक्शन को प्रभावित नहीं करती हैं। दूसरी तरफ, कंपाइलर त्रुटियों के साथ निपटा जाना चाहिए। न्यूजबीटर के साथ, जब मैंने भाग लिया, चीजें थोड़ी देर के लिए ठीक हो गईं, लेकिन फिर मुझे एक त्रुटि मिली:

tester@sitlabcpu22:~/download/newsbeuter-1.3$ make
...
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/configparser.o -c src/configparser.cpp
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/colormanager.o -c src/colormanager.cpp
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:5:18: error: stfl.h: No such file or directory
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:33: error: ISO C++ forbids declaration of \u2018stfl_form\u2019 with no type
./include/stflpp.h:33: error: expected \u2018;\u2019 before \u2018*\u2019 token
./include/stflpp.h:34: error: ISO C++ forbids declaration of \u2018stfl_ipool\u2019 with no type
./include/stflpp.h:34: error: expected \u2018;\u2019 before \u2018*\u2019 token
make: *** [src/colormanager.o] Error 1

जैसे ही पहली त्रुटि का सामना करना पड़ता है, प्रक्रिया प्रक्रिया बंद हो जाएगी। कंपाइलर त्रुटियों को संभालना कभी-कभी मुश्किल व्यवसाय हो सकता है। आपको समस्या के बारे में कुछ सुरागों के लिए त्रुटियों को देखना होगा। आम तौर पर, समस्या यह है कि कुछ शीर्षलेख फ़ाइलें, जिनमें आमतौर पर विस्तार होता है .h या .hpp, याद कर रहे हैं। उपरोक्त त्रुटि के मामले में, यह स्पष्ट है (या होना चाहिए!) स्पष्ट है कि समस्या यह है कि stfl.h हेडर फ़ाइल नहीं मिल सका। जैसा कि यह उदाहरण दिखाता है, आप त्रुटि संदेश की पहली पंक्तियों को देखना चाहते हैं और समस्या के अंतर्निहित कारण को खोजने के लिए अपना रास्ता नीचे काम करना चाहते हैं।

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

एसटीएफएल टूलकिट को सफलतापूर्वक स्थापित करने के बाद, न्यूज़बीटर के लिए मेक प्रक्रिया सफलतापूर्वक भाग गई। मेक प्रोसेस आम तौर पर उठाता है जहां यह बंद हो जाता है (त्रुटि के बिंदु पर)। इस प्रकार, किसी भी फाइल जो पहले ही संकलित हो चुकी है उसे पुनः संकलित नहीं किया जाएगा। यदि आप सब कुछ पुनः संयोजित करना चाहते हैं, तो आप किसी भी संकलित वस्तुओं को हटाने के लिए सभी को साफ़ कर सकते हैं और फिर फिर से चला सकते हैं।

स्थापित कर रहा है

निर्माण प्रक्रिया सफलतापूर्वक पूर्ण होने के बाद, आप एप्लिकेशन इंस्टॉल करने के लिए तैयार हैं। ज्यादातर मामलों में, फ़ाइल सिस्टम के सामान्य क्षेत्रों में एप्लिकेशन को स्थापित करने के लिए (उदा। /usr/bin या /usr/share/bin, आदि), आपको स्थापना को रूट के रूप में चलाने की आवश्यकता होगी। स्थापना पूरी प्रक्रिया में वास्तव में सबसे आसान कदम है। टर्मिनल रन में स्थापित करने के लिए:

$ make install

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

जब आप स्रोत से कोई एप्लिकेशन बनाते हैं, तो यह आमतौर पर उबंटू में जीयूआई मेनू में आइकन या शॉर्टकट नहीं जोड़ता है। आपको इसे मैन्युअल रूप से जोड़ना होगा।

और यह मूल रूप से प्रक्रिया है, यद्यपि उबंटू में स्रोत से अनुप्रयोग बनाने और स्थापित करने के लिए संभावित रूप से पुनरावृत्त है। यह कुछ बार करने के बाद, यह आपके लिए दूसरी प्रकृति बन जाएगा!


9
2017-07-31 14:09



टिम, मुझे आपके ट्यूटोरियल को पढ़ना अच्छा लगेगा, लेकिन आपके द्वारा पोस्ट किया गया लिंक काम नहीं करता है। - gareth_bowles


ठीक है, ./configure --help आपको बहुत सारी जानकारी देगा, जीएनयू ऑटोोटूल ने फ़ाइलों को कॉन्फ़िगर किया है। इनमें से अधिकतर सुविधाओं को सक्षम किए बिना - साथ / - नीचे आते हैं (ये लाइब्रेरी को कहां ढूंढें कहने के लिए "साझा" जैसे अतिरिक्त पैरामीटर ले सकते हैं)।

अन्य महत्वपूर्ण हैं --prefix (जो / usr / local / अधिकांश समय के लिए डिफ़ॉल्ट) कहने के लिए कहां स्थापित करें (यदि आप संकुल बना रहे हैं तो आप आमतौर पर इसे --prefix = / usr या शायद --prefix के रूप में चाहते हैं = / opt / YourPackage)।

लिनक्स पर, / lib, / usr / lib और / usr / local / lib आमतौर पर मेरे जीसीसी की खोज की जाती है, और ldconfig की डिफ़ॉल्ट कॉन्फ़िगरेशन में शामिल होती है। जब तक आपके पास कोई अच्छा कारण न हो, यह वह जगह है जहां आप अपनी पुस्तकालय चाहते हैं। हालांकि, /etc/ld.so.conf अतिरिक्त प्रविष्टियों को सूचीबद्ध कर सकता है।

कॉन्फ़िगर करें और उन्हें "gcc -l" चलाने का प्रयास करके ढूंढें और यह त्रुटियों को देखकर देखें। खोज के लिए अतिरिक्त पथ जोड़ने के लिए आप अपने CFLAGS पैरामीटर में "-L" जोड़ सकते हैं।

आपके पास एकाधिक संस्करण स्थापित हो सकते हैं, और पुराने संस्करण के खिलाफ जुड़े सॉफ़्टवेयर इसके खिलाफ जुड़े रहेंगे (लिनक्स पर बाध्यकारी खोजने के लिए ldd चलाएं), लेकिन नई संकलन आम तौर पर आपके सिस्टम पर गतिशील लाइब्रेरी के नवीनतम संस्करण को लक्षित करती हैं।

अधिकांश सॉफ़्टवेयर गतिशील libs मानते हैं, खासकर यदि यह libtool का उपयोग करता है, तो आप गैर-तुच्छ ऐप्स सही तरीके से स्थिर नहीं बना सकते हैं।

पुस्तकालय स्थापित करने के लिए ls -l आपकी सबसे अच्छी शर्त है।

और यही वह जगह है जहां मैं जानकारी से बाहर हूं; पैकेज के साथ अच्छी तरह से कैसे खेलें: पता नहीं। जब भी संभव हो, मैं समस्या से बचने के लिए चीजों को एक पैकेज में लपेटकर लपेटता हूं।


5
2017-07-27 09:11





"मैं कैसे पता लगा सकता हूं कि ./configure को पास करने के लिए कौन से तर्क हैं?"

आमतौर पर: ./configure --help आपको बताएगा कि आप वहां क्या चाहते हैं।

"मैं कैसे बता सकता हूं कि मैंने कौन से पुस्तकालय स्थापित किए हैं, और कौन से संस्करण हैं?"

यह प्रणाली पर निर्भर करता है। एक तरीका सिर्फ एक करना है find /|grep libname|less आमतौर पर पुस्तकालय फ़ाइलों के पास फ़ाइल नाम में संस्करण होता है।

"मैं अपनी सामान्य प्रणाली को तोड़ने के बिना पुस्तकालय के एक से अधिक संस्करण कैसे स्थापित कर सकता हूं?"

फिर, सिस्टम और पुस्तकालय पर निर्भर करता है। sudo make altinstall आपके लिए एक संस्करण नाम बनाया जाएगा। लाइब्रेरी फाइलें आमतौर पर संस्करण खुद ही होती हैं। हालांकि ध्यान रखें; चूंकि संस्करण अक्सर "सामान्यीकृत" नाम के लिए सिम्लिंक बनाते हैं, यह चीजों को तोड़ सकता है।

"अगर मैं किसी ऐसे सिस्टम पर स्रोत से सामान स्थापित कर रहा हूं जो अन्यथा संकुल का उपयोग करके प्रबंधित किया जाता है, तो ऐसा करने का सबसे साफ तरीका क्या है?"

./Configure में --prefix पैरामीटर का उपयोग करना और उन्हें कहीं भी डालना /opt पालन ​​करने के लिए एक अच्छा अभ्यास है।

अस्वीकरण: मैं किसी विशेषज्ञ से नहीं हूं, लेकिन मैं लिनक्स का उपयोग 5 साल से अधिक समय से कर रहा हूं cmd लाइन से (स्लैकवेयर, सेंटोस, रेडहाट, उबंटू, मिस्क अन्य, और ओएस एक्स)।


3
2017-07-27 09:13





आपके कुछ प्रश्नों का उत्तर देने के लिए मुझे यह देखने का एक अच्छा तरीका मिला कि आपने कौन सी लाइब्रेरी स्थापित की हैं और संस्करण (यह लिनक्स डेबियन पर है इसलिए इसे अन्य संस्करणों के साथ भी काम करना चाहिए)।

dpkg --list

आपको इस तरह के कुछ आउटपुट के साथ वास्तव में एक लंबी सूची मिलनी चाहिए

ii  libssl0.9.8    0.9.8c-4etch5  SSL shared libraries
ii  libssp0        4.1.1-21       GCC stack smashing protection library
ii  libstdc++5     3.3.6-15       The GNU Standard C++ Library v3
ii  libstdc++5-3.3 3.3.6-15       The GNU Standard C++ Library v3 (development
ii  libstdc++6     4.1.1-21       The GNU Standard C++ Library v3

3
2017-07-27 09:12





साइमन,

1.) ./configure --help अच्छी जानकारी प्रदान करता है। मैं इसे जांचने का सुझाव देता हूं। उचित रूप से स्थिर / गतिशील रूप से जुड़े पुस्तकालयों को संकलित करने के लिए इसमें आमतौर पर विकल्प होते हैं।

2.) लिबिक गतिशील लिंकर पथ में रहते हैं। यह आमतौर पर /etc/ld.so.conf में सेट होता है। लिंकर उपयुक्त पुस्तकालयों की खोज करता है जो पाथ पर्यावरण चर की तरह पहले पाए जाते हैं।

3.) यह आमतौर पर समस्याओं का कारण बनता है क्योंकि लाइब्रेरी संस्करण में परिवर्तन होने पर आपको सबकुछ फिर से जोड़ना पड़ता है। यदि आप कुछ खोज करते हैं तो आपको शायद कारणों से मिल जाएंगे कि क्यों स्थैतिक रूप से लिंक करना एक बुरा विचार है। मैंने इसे इतनी देर तक नहीं किया है कि मैं वास्तव में यहां विस्तार से विस्तार नहीं कर सकता।

4.) यह थोड़ा मुश्किल है। आपको पूरी तरह से सुनिश्चित करने के लिए अपने लाइब्रेरी पथ की जांच करनी होगी। पुस्तकालयों में आम तौर पर स्थापित संस्करण के लिए एक प्रतीकात्मक लिंक होता है।

जैसे libssh2.so.1 -> libssh2.so.1.0.0

आम तौर पर लोग पुस्तकालयों और कार्यक्रमों का प्रबंधन करते हैं जो वे अपने स्वयं के डेबियन पैकेज रोलिंग या किसी अन्य तकनीक का उपयोग करके स्थापित करते हैं। मैं स्टोव का उपयोग कर स्थापित सॉफ्टवेयर का प्रबंधन करता हूं (http://www.gnu.org/software/stow/) जो बहुत सरल है और प्रतीकात्मक लिंक का उपयोग कर पुस्तकालय स्थापित करता है। मुझे यह आसान लगता है क्योंकि मुझे डेब / आरपीएम पैकेज बनाने / स्थापित / परीक्षण करने की आवश्यकता नहीं है।

5.) लाइब्रेरी निर्देशिकाओं में पुस्तकालयों के कई संस्करण सामान्य रूप से स्थापित किए जा सकते हैं। निष्पादन योग्य से जुड़े पुस्तकालय उन संस्करणों से जुड़े रहेंगे जो उनके खिलाफ जुड़े थे। एक निष्पादन योग्य पर चलने वाला एलडी आपको बताएगा कि निष्पादन योग्य कौन से पुस्तकालयों से जुड़ा हुआ है।

6.) जैसा कि मैंने पहले उल्लेख किया था, अपने स्वयं के डेबियन पैकेज रोलिंग या स्टोव का उपयोग करना शायद सबसे साफ समाधान है।

7.) मैं वास्तव में मैक ओएसएक्स के लिए बात नहीं कर सकता लेकिन लिनक्स के लिए वितरण की पैकेजिंग प्रणाली सबसे अच्छा तरीका है।

8.) संभवतः बहुत निराशा का हल किया जा सकता है और यह पता लगाने के लिए कि किस संस्करण के साथ कुछ संस्करण जुड़ा हुआ है या निष्पादन योग्य के साथ जुड़ी लाइब्रेरी क्या नहीं मिल सकती है। pkg-config आपको बहुत मदद करेगा, लेकिन केवल इसका उपयोग करने वाले सॉफ़्टवेयर के लिए। यह डिफ़ॉल्ट autotools बिल्ड सिस्टम का हिस्सा नहीं है हालांकि यह इन दिनों लोकप्रिय है।


3
2017-07-27 09:22