मैं करने की जरूरत है पार संकलन कुछ C/C++ पुस्तकालय। पुस्तकालय कई सी/सी ++ पुस्तकालयों पर निर्भर करता है। बदले में पुस्तकालयों में से कुछ अन्य पुस्तकालयों पर निर्भर करते हैं। सभी पुस्तकालय कॉन्फ़िगर स्क्रिप्ट के साथ आते हैं। मुझे पता है कि मेजबान सिस्टम पर पुस्तकालयों को संकलित और स्थापित करने के लिए - मुझे आवश्यक lib की आवश्यकता से पहले निर्भरता स्थापित करें। स्पष्ट रूप से यह क्रॉस-संकलन करते समय काम नहीं करेगा। किसी भी सुझाव की सराहना की जाती है। धन्यवाद।सी ++ को पार करने के लिए कैसे - निर्भरताओं के साथ लाइब्रेरी?
उत्तर
आम तौर पर, एक ऑटोोटूल पैकेज को पार करने के लिए, आप ./configure
: --host
और --build
पर कुछ अतिरिक्त तर्क पारित करते हैं। --host
प्रणाली है कि बनाया कार्यक्रमों पर चलेंगे का नाम है, और --build
प्रणाली है कि संकलन करता है का नाम है।
जब मैं कहता हूँ "प्रणाली का नाम है", मैं प्रपत्र ARCH-VENDOR-OS-LIBC
की एक टपल मतलब है। अपने सिस्टम पर (, (उदाहरण के i686-pc-linux-gnu
लिए टपल प्रणाली मैं वर्तमान में उपयोग कर रहा हूँ का वर्णन है।) mingw32 toolchain के मामले में कभी कभी टपल के कुछ हिस्सों elided कर रहे हैं, mingw32 पार उपकरण टपल साथ स्थापित कर रहे हैं i586-mingw32msvc
और/या amd64-mingw32msvc
)।
प्रत्येक toolchain /usr
जैसे तहत अपने स्वयं के उपनिर्देशिका है (वहाँ कॉन्फ़िगर करने के लिए एक और तर्क, --target
, जो क्रॉस-संकलन compilers के लिए है और प्रणाली है कि संकलक जब कोड जनरेट लक्षित करेंगे बनाया जा रहा निर्दिष्ट करता है।)
/usr/i586-mingw32msvc
। आप यहां नए पैकेज स्थापित करना चाहते हैं ताकि वे पाए जाए। --prefix
configure
पर तर्क का प्रयोग करें।
तो करने के लिए एक MinGW32 सिस्टम में अपनी जीएनयू/लिनक्स सिस्टम से पार संकलन, मैं configure
इस तरह चलाने होगा:
./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc
तो अपने निर्भरता ग्राफ की पत्तियों के साथ शुरू करने और अपने तरीके से काम करते हैं। कि libtooled संकुल के लिए गतिशील पुस्तकालयों के निर्माण बंद हो जाएगा: तुम भी --enable-static --disable-shared
configure
को पारित करने के लिए कर सकते हैं। आप उन्हें पार संकलन, एक पैकेज के निर्माण के हिस्से के रूप में एक कार्यक्रम चलाने के लिए आवश्यक है या नहीं के रूप में कुछ पैकेज इंस्टॉल में मूल रूप से भी हो सकते हैं।
कभी कभी configure
के परीक्षण असफल हो जायेगी: जहां यह संकलन और एक कार्यक्रम चलाने के लिए, उदाहरण के लिए कोशिश करता है। अक्सर इन परीक्षणों एक कैश चर जो आप भी configure
को कमांड लाइन पर पारित कर सकते हैं निर्धारित किया है। इसी तरह, आप कार्यक्रम रास्तों और पुस्तकालय संकलन/लिंक झंडे तरह बातें ओवरराइड कर सकते हैं। अपने पैकेज के ./configure --help
की जाँच करें।
आप क्या करने की जरूरत सभी निर्भरता के लिए स्थिर पुस्तकालयों बना सकते हैं और स्थिर उन्हें अपने निष्पादन से जोड़ने के लिए है। आपको उन पुस्तकालयों का उत्पादन करने के लिए क्रॉस कंपाइलर का उपयोग करने की आवश्यकता होगी। आप "mingw static link cross compile" देखकर कुछ अच्छे उदाहरण देख सकते हैं
क्रॉस-संकलित साझा पुस्तकालयों के खिलाफ निर्माण में बिल्कुल कोई समस्या नहीं है जब तक आप सुनिश्चित करते हैं कि आप लक्ष्य प्रणाली के लिए शीर्षलेखों और पुस्तकालयों के खिलाफ निर्माण कर रहे हैं विकास मेजबान की बजाय।
भले ही आप स्थिर पुस्तकालयों के रूप में स्पष्ट dependancies के सभी बनाया, तो आप शायद अभी भी अपने आप साझा C और C++ भाषा क्रम पुस्तकालयों के विरुद्ध लिंक मिल जाएगा। आप यह भी सुनिश्चित करना चाहते हैं कि क्रॉस-कंपाइलिंग के लिए उपयोग की जाने वाली हेडर फाइलें विकास होस्ट की बजाय आपके लक्षित सिस्टम से हैं।
ऐसा नहीं करना शायद अधिकतर समय काम करेगा। शेष समय आपको सूक्ष्म हार्ड-टू-डीबग क्रैश मिलेगा।
आप कैसे प्राप्त कर इस पर कैसे अपने पार उपकरण श्रृंखला और लक्ष्य पर्यावरण निर्भर करता है। जैसा कि आपने न तो उल्लेख किया है, मैं अनुमान लगाऊंगा कि यह जीसीसी और विकास मेजबान और लक्ष्य के रूप में लिनक्स का कुछ स्वाद है - हालांकि सिद्धांत अन्य विकास मेजबानों का उपयोग करने के लिए समान रूप से लागू होते हैं।
पार संकलन जीसीसी और बिन-utils वितरण आम तौर पर तो निर्माण कर रहे हैं कि लक्ष्य प्रणाली के रूट फाइलिंग प्रणाली की एक प्रति के लिए डिफ़ॉल्ट लाइब्रेरी और हैडर खोज पथ अंक। यह वह जगह है जहां लिंकर साझा पुस्तकालयों के खिलाफ लिंक करने के लिए देखेगा, और यह यहां है कि जब आप बनाए जाते हैं तो आप अपने आश्रित साझा पुस्तकालयों को स्थापित करते हैं।
आप कमांड लाइन पर जीसीसी के लिए --sysroot <mySysRoot>
विकल्प पास करके जीसीसी के डिफ़ॉल्ट सिस्टम रूट ओवरराइड कर सकते हैं।