linker - .cbproj फ़ाइल में पैकेज आयात को समझना




c++builder c++builder-2010 (2)

मैं एम्बरकैडोरो रोड स्टूडियो 2010 (सी ++) का उपयोग कर रहा हूं प्रोजेक्ट फाइल (.cbproj) में पांच अलग टैग हैं जिनमें .bpis या .libs की सूची हो सकती है। मैं कुछ जानकारी चाहूंगा कि लिंकर द्वारा इन पुस्तकालयों की प्रत्येक सूची का उपयोग कैसे किया जाता है (रनटाइम संकुल के साथ या इसके निर्माण के दौरान)।

LinkPackageImports

LinkPackageStatics

AllPackageLibs

PackageLibs

PackageImports
मुझे लगता है कि मैं पहले से ही इस अंतिम एक को समझता हूं। इसमें रनटाइम पैकेज की सूची है जो कि आईडीई में प्रोजेक्ट प्रॉपर्टी से सेट की जा सकती है।

इस सवाल के लिए प्रेरणा है कि मैं अपने आवेदन से अनावश्यक निर्भरता को खत्म करने की कोशिश कर रहा हूं। .cbproj में ये पांच टैग प्रत्येक अलग-अलग लिबड्स और बीपीआईएस के मनमाना वर्गीकरण को देखते हैं। मुझे लगता है कि मुझे ज़रूरत नहीं है कुछ पुस्तकालयों, और कुछ पुस्तकालय मुझे लगता है कि मुझे जरूरत नहीं है कुछ सूचियों में से कुछ पुस्तकालयों को हटाने से कोई प्रभाव नहीं लगता है, जबकि दूसरी सूची से अन्य पुस्तकालयों को निकालने के कारण [ILINK32 Error] Fatal: Unable to open file 'FILENAME.OBJ'

मैं धीरे-धीरे सभी लिंकर मुद्दों को हल कर रहा हूं, लेकिन वास्तव में जानने के लिए वास्तव में मददगार होगा कि मैं लिंकर को क्या कह रहा हूं जब मैं इन पांच सूचियों में से एक में एक पुस्तकालय नाम शामिल करता हूँ


यार, मुझे आशा है कि आप पहले से ही अपनी समस्याओं का समाधान प्राप्त कर चुके हैं, लेकिन मुझे लगता है कि आपके पास केवल रनटाइम पैकेज के साथ अक्षम करें, डायनेमिक RTL का उपयोग करें को अक्षम करें और डिबग से रिलीज बिल्ड को बदलने के लिए, सभी परियोजनाओं के लिए आप उपयोग कर रहे हैं ( http: // bcbjournal.org/articles/vol4/0009/building_stand-alone_EXEs.htm?PHPSESSID=08f2084c32d5fce05f13518fef23f358 )।

यदि आपके पास कुछ घटक हैं जो आप इसे बदल नहीं सकते हैं, जैसे कि कुछ बाइनरीज़ (डीएलएल, लिब ...), तो आप उन अक्षम विकल्पों पर कुछ निर्भरता के साथ होंगे, यदि वे पहले से उनके साथ बनाए गए हैं ...

मैं आपको अपने परियोजना से सभी * .obj और * .exe को हटाने के लिए शुभकामना देता हूं (यदि वे कुछ तृतीय पक्ष मॉड्यूल के लिए अपेक्षित के रूप में उपलब्ध कराए जाते हैं) को छोड़ने से पहले ... कुछ पुराने C ++ बिल्डर संस्करणों में कुछ समस्याओं का हल होता है जिन्हें हल किया जाता है मार्ग।


मुझे यकीन है कि यह जानकारी कहीं मौजूद होगी, लेकिन मैं इसे किसी भी मंच या दस्तावेज़ीकरण में खोजने में असमर्थ हूं। मैंने अपने स्वयं के प्रयोग से यह सभी का अनुमान लगाया है, लेकिन मैं अधिक आधिकारिक स्रोत से प्रतिक्रिया की सराहना करता हूं।

पैकेज इंपोर्ट - यह आईडीई में प्रोजेक्ट ऑप्शंस में "रनटाइम पैकेज" की सूची के रूप में दिखाई देता है। यदि आप IDE में "रनटाइम पैकेज" सूची से कुछ भी जोड़ या हटाते हैं, तो यह टैग उस प्रतिबिंबित करने के लिए अद्यतन किया जाएगा यदि यह टैग खाली है या cbproj फ़ाइल से गायब है, तो यह स्वचालित रूप से आरएडी स्टूडियो में स्थापित सभी डिजाइन समय संकुल से जुड़े सभी रन-टाइम संकुलों की एक सूची के साथ पॉप्युलेट हो जाएगा। कमांड लाइन से निर्माण करते समय इस टैग का कोई प्रभाव नहीं पड़ता है आईडीई पैकेज इम्पोर्ट्स टैग का इस्तेमाल सिर्फ पुस्तकालयों की गणना करने के लिए करता है, जो वास्तव में लिंक होने जा रहा है।

इस सूची में एक पुस्तकालय रखकर (स्वयं के द्वारा) कोई नई निर्भरता नहीं बनाते हैं; आप अनिवार्य रूप से आईडीई को बता रहे हैं "यदि आपको इनमें से किसी भी पुस्तकालय को लिंक करना है, तो उन्हें स्थिति के बजाए गतिशील रूप से लिंक करें"।

AllPackageLibs - यह उन सभी पुस्तकालयों की आईडीई की सूची है, जिन्हें लगता है कि परियोजना के लिए सफलतापूर्वक लिंक करने के लिए आवश्यक है। कमांड लाइन से निर्माण करते समय इस टैग का कोई प्रभाव नहीं पड़ता है यदि आप प्रोजेक्ट में कोई बदलाव करते हैं (उदाहरण के लिए कोई फ़ाइल जोड़ें) आईडीई AllPackageLibs की सामग्री को फिर से संगठित करने का प्रयास करेगा यह इस परियोजना की फाइलों में #pragma link से पाई जाती है। (मैंने परियोजना के सभी #pragma link प्रगमा #pragma link को टिप्पणी करके यह निर्धारित किया है और यह ध्यान दिलाता है कि जब मैंने एक परियोजना संशोधन किया है, तो ऑलपैकेज लाइब्स का पुनर्पूंजीकरण नहीं किया गया था।)

LinkPackageStatics - अगर आईडीई AllPackageLibs में एक लाइब्रेरी पाता है जो पैकेजआईएमपोर्ट्स में प्रकट नहीं होता है, तो यह उस पुस्तकालय को स्थायी रूप से लिंक करने का फैसला करता है। उस स्थिति में, IDE स्वचालित रूप से लाइब्रेरी नाम को LinkPackageStatics पर कॉपी कर देगा। अगर आईडीई से इमारत, यह टैग हमेशा AllPackageLibs और PackageImports से पुनःसंयुक्त होगा, इसलिए जो कुछ भी आप यहां जोड़ते हैं वह मैन्युअल रूप से लिंकर द्वारा अनदेखा कर दिया जाएगा हालांकि, यदि कमांड लाइन से निर्माण किया गया है, तो इस टैग (.libs या .bpis) में सभी फाइलें लिंक की जाएंगी और आईआईएल 3232 के कमांड लाइन के 'ओबजफाइल' खंड में दिखाई देंगी।

LinkPackageImports- अगर आईडीई AllPackageLibs में एक लाइब्रेरी पाता है जो पैकेजआईएमपोर्ट्स में प्रदर्शित होता है, तो वह उस पुस्तकालय को डायनामिक रूप से लिंक करने का फैसला करता है। उस स्थिति में, आईडीई लाइब्रेरी का नाम (.बीपीआई एक्सटेंशन के साथ) को कॉपीपैकेज इंपोर्ट्स में कॉपी करेगा। अगर आईडीई से इमारत, यह टैग हमेशा AllPackageLibs और PackageImports से पुनःसंयुक्त होगा, इसलिए जो कुछ भी आप यहां जोड़ते हैं वह मैन्युअल रूप से लिंकर द्वारा अनदेखा कर दिया जाएगा हालांकि, यदि कमांड लाइन से निर्माण किया गया है, तो इस टैग (.libs या .bpis) में सभी फाइलें लिंक की जाएंगी और आईएलआईसीसी 32 के कमांड लाइन के 'libfiles' खंड में दिखाई देंगी।

PackageLibs - PackageLibs (.libs या .bpis) में कुछ भी सीधे IDE द्वारा LinkPackageStatics में जोड़ा जाएगा (चाहे PackageImports में शामिल हो) ये लिब्स को लिंक्स के सामने LinkPackageStatics में जोड़ा जाता है जो कि AllPackageLibs से आते हैं। कमांड लाइन के निर्माण इस टैग से प्रभावित नहीं हैं।

कभी भी आप IDE को आपके लिए LinkPackageStatics या LinkPackageImports को संशोधित करने की अपेक्षा कर रहे हैं, आपको पहले IDE में प्रोजेक्ट को बनाने की आवश्यकता होगी; फिर परियोजना विकल्पों में एक मामूली परिवर्तन करें (और इसे पूर्ववत करें); तो परियोजना को बचाने इस बिंदु पर IDE को लिंकपैकेजस्टाटिक्स या लिंकपैकेज इंपोर्ट्स को cbproj में लिखा जाएगा ताकि आपके प्रोजेक्ट को कमांड लाइन पर जोड़ा जा सके।

लाइब्रेरी लिंक करने के अन्य तरीके - इन चार टैगों को शामिल नहीं करने वाली फ़ाइलों को निर्दिष्ट करने के लिए कुछ तरीके भी हैं। आप सीधे परियोजना में .lib जोड़ सकते हैं (परियोजना पर राइट-क्लिक करें | जोड़ें ...), या आप उन फ़ाइलों में से एक में लाइन #pragma comment (lib, "libraryname.lib") सकते हैं जो परियोजना।

यदि आप सीधे परियोजना के लिए .lib जोड़ते हैं, तो यह लिंक-पंक्ति पर अन्य सभी पुस्तकालयों के साथ लिंक किया जाएगा। यदि आप #pragma comment चाल का उपयोग करते हैं, तो लाइब्रेरी कमांड लाइन पर प्रकट नहीं होगी, और आप यह नहीं देख पाएंगे कि यह लिंक था ( tdump का उपयोग tdump और निर्यात को देखने के अलावा)।

सारांश

कमांड लाइन से लिंक करते समय, इनमें से कोई भी प्रभाव (इन पांच में से) में cbproj टैग्स लिंकपैकेजस्टाटिक्स (ओबीजफाइल अनुभाग में जोड़ने के लिए लिब्स) और लिंकपैकेज इम्पोर्ट्स (libfiles अनुभाग में जोड़ने के लिए लिब्स) इन टैग की सामग्री को ऑलपीकेज़ लाइब्स और पैकेज इंपोर्ट्स से IDE द्वारा गिना जाता है, लेकिन यदि आप कमांड लाइन से लिंक करना चाहते हैं, तो आप उन्हें .cbproj में मैन्युअल रूप से सेट कर सकते हैं।

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

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