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


47

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

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

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

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

जवाबों:


40

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pkg-config --list-all

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

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

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

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

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

/usr/local/Cellar/wget/1.1.4

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

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

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

मेरा मानना ​​है कि होमब्रे मार्ग सबसे स्वच्छ है, इसलिए इसका उपयोग करें या समकक्ष करें। / Usr / स्थानीय / pkgs / नाम / संस्करण और सिमिलिंक या हार्ड लिंक को बाकी हिस्सों में स्थापित करें।

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

7. मान लें कि मैं स्रोत से कुछ संकलित करने का प्रबंधन करता हूं, तो मैं कैसे पैकेज कर सकता हूं ताकि अन्य लोगों को समान हुप्स के माध्यम से कूदना न पड़े? खासतौर पर OS X पर…।

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

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

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

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

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

Homebrew के साथ मेरे भविष्य के लक्ष्यों में से एक वेबसाइट पर एक लिंक पर क्लिक करना संभव है। अभी तक नहीं किया गया है, लेकिन बहुत मुश्किल नहीं कि मैंने जो डिजाइन चुना है।

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

ओटूल वास्तव में केवल बाद में उपयोगी है। यह आपको बताता है कि अंतर्निहित बाइनरी लिंक क्या हैं। जब आप एक उपकरण की निर्भरता का पता लगा रहे हैं जो आपको बनाना है, तो यह बेकार है। यह pkg-config के समान है क्योंकि आपने इसे उपयोग करने से पहले ही निर्भरता स्थापित कर ली होगी।

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


2
दिलचस्प है, Homebrew पोर्टेज (जेंटू लिनक्स से पैकेज मैनेजर) की तरह लगता है। काम का एक अच्छा टुकड़ा की तरह लगता है।
डेविड जेड

12

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

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

ELF

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

man ld.so 

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

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

ldconfig -v -N -X

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

मच-ओ

OS X पर बाइनरी फॉर्मेट Mach-O है। लिंकर के लिए स्थानीय प्रणाली प्रलेखन है

man dyld

मच प्रारूप दस्तावेज़ एप्पल पर उपलब्ध है

UNIX उपकरण बनाएँ

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

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


10

साइमन! मैं जानता हूं कि तुम कैसा महसूस करते हो; मैं लिनक्स सीखने के इस हिस्से से भी जूझता रहा। अपने स्वयं के अनुभवों के आधार पर, मैंने कुछ ऐसी वस्तुओं के बारे में एक ट्यूटोरियल लिखा है जिन्हें आप संबोधित करते हैं (ज्यादातर अपने लिए एक संदर्भ के रूप में!): 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का अर्थ है कि यह एक "टेप संग्रह" है, जो फ़ाइलों है कि उनके रिश्तेदार निर्देशिका संरचना को बरकरार रखता है का एक समूह है। .gzGzip (जीएनयू ज़िप) है, जो एक लोकप्रिय यूनिक्स / लिनक्स संपीड़न प्रारूप है के लिए खड़ा है। इसी तरह, .bz2bzip2 के लिए खड़ा है, जो एक नया संपीड़न प्रारूप है जो gzip की तुलना में उच्च संपीड़न (छोटे संपीड़ित फ़ाइल आकार) प्रदान करता है।

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

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

            $ tar -zxvf filename.tar.gz

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

            $ tar -jxvf filename.tar.gz

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

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

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

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

कॉन्फ़िगरेशन और कॉन्फ़िगरेशन त्रुटियाँ

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

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

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

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

    $ python setup.py install

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

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

$ ./config

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

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

एक उदाहरण

इस ट्यूटोरियल में, मैं टेक्स्ट-आधारित आरएसएस रीडर का उपयोग करने जा रहा हूं, जिसे न्यूज़बीटर कहा जाता है, यह उन त्रुटियों के प्रकारों के लिए एक उदाहरण के रूप में है, जिन्हें आप अपने एप्लिकेशन का निर्माण करते समय सामना कर सकते हैं। Newsbeuter के लिए, कॉन्फ़िगरेशन स्क्रिप्ट का नाम है 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, टर्मिनल में ठेठ एप्ट-गेट स्थापित कमांड चलाएं:

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

अब, हमें config.shयह सुनिश्चित करने के लिए फिर से दौड़ना होगा कि हमने इस निर्भरता की समस्या को हल कर दिया है और हमें और अधिक निर्भरता की समस्या नहीं है। (जबकि मैं इसे यहाँ नहीं दिखाया जाएगा, Newsbeuter के मामले में, मैं भी स्थापित करने के लिए किया था 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हेडर फ़ाइल नहीं मिल सकती है। जैसा कि इस उदाहरण से पता चलता है, आप त्रुटि संदेश की पहली पंक्तियों को देखना चाहते हैं और समस्या के अंतर्निहित कारण का पता लगाने के लिए अपना काम करना चाहते हैं।

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

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

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

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

$ make install

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

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

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


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

6

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

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

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

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

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

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

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

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


4

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

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

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

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

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

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

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

- ./configure पैरामीटर को ./configure में उपयोग करना और उन्हें कहीं पर रखना /optएक अच्छा अभ्यास है।

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


4

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

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

4

साइमन,

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

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

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

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

उदाहरण के लिए libssh2.so.1 -> libssh2.so.1.0.0

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

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

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

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

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


4

स्टेटिक लाइब्रेरी एक अच्छा विचार नहीं है - यदि आपको लाइब्रेरी को अपग्रेड करने की आवश्यकता है (उदाहरण के लिए, एक सुरक्षा समस्या को ठीक करने के लिए), तो आपको उस लाइब्रेरी पर निर्भरता के साथ सब कुछ फिर से तैयार करना होगा।

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


4

यद्यपि यह स्पष्ट रूप से आपके प्रश्नों की सूची में नहीं था, आप अपने प्रस्तावना में उल्लेख करते हैं:

./configure && make && sudo make install आमतौर पर पर्याप्त है, लेकिन कभी-कभी यह काम नहीं करता है - और जब ऐसा नहीं होता है, तो मैं अक्सर फंस जाता हूं।

जब मैं डेबियन या उबंटू पर फंस जाता हूं, तो मैं ऑटो-एप का उपयोग करूंगा जो स्वचालित रूप से उन पैकेजों को स्थापित करेगा जिसमें वे फाइलें होती हैं जो खोजने के लिए कॉन्फ़िगर होती हैं।

देख:

एक अन्य टूल जो आपको काम में आता है वह है CheckInstall, यह make installस्थापित पैकेजों की आपकी सूची के साथ इंस्टॉल किए गए एप्लिकेशन को जोड़ता है: https://help.ubuntu.com/community/CheckInstall


3

ओएस एक्स के लिए:

  • मैं कैसे पता लगा सकता हूँ कि ./configure को पास करने के लिए क्या तर्क दिए गए हैं?

./configure --help

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

साझा पुस्तकालयों का उपयोग करने से आपको लाइब्रेरी का उन्नयन करने की अनुमति मिलती है, जो इसके उपयोग के लिए हर चीज को फिर से तैयार किए बिना।

  • साझा किए गए लाइब्रेरी OS X / Linux के तहत कैसे काम करते हैं - वे फाइल सिस्टम पर कहां रहते हैं, कैसे ./configure && उन्हें खोजते हैं, वास्तव में उनके खिलाफ लिंक होने पर क्या होता है

सिस्टम लाइब्रेरी / usr / lib में रहते हैं।

आपके द्वारा लाइब्रेरियों को अपने आप में / usr / local / lib (/ usr / लोकल के लिए डिफ़ॉल्ट - उपसर्ग ध्वज / .configure) के रूप में संकलित किया जाता है।

पर्यावरण चर DYLD_FALLBACK_LIBRARY_PATH और LD_LIBRARY_PATH आपको यह निर्दिष्ट करने देते हैं कि कौन से फ़ोल्डर में देखना है, इसलिए सूची के प्रारंभ में usr / usr / local / lib होना चाहिए।

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

/ Usr / स्थानीय के लिए सब कुछ स्थापित करें - ऊपर पर्यावरण चर के साथ, संस्करण / usr / स्थानीय / lib आपके वातावरण में / usr / lib में संस्करण पर पूर्वता लेता है।

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

/ Usr / स्थानीय पर स्थापित करें। उबंटू में, मैं कोशिश करता हूं और एक डिबेट पैकेज बनाने के लिए पहले चेकइंस्टेक का उपयोग करूं।

  • यह मानते हुए कि मैं स्रोत से कुछ संकलित करने का प्रबंधन करता हूं, तो मैं कैसे पैकेज कर सकता हूं ताकि अन्य लोगों को समान हुप्स के माध्यम से कूदना न पड़े? खासतौर पर OS X पर…।

एक ब्लॉग पोस्ट में संकलन चरणों का दस्तावेज़, मैं कहूँगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.