2012-08-02 17 views
9

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

LinkPackageImports

LinkPackageStatics

AllPackageLibs

PackageLibs

PackageImports +०१२३८००७३१ मुझे लगता है कि मैं पहले से ही इस आखिरी को समझता हूं। इसमें रनटाइम पैकेज की सूची शामिल है जिसे आईडीई में प्रोजेक्ट प्रॉपर्टीज से सेट किया जा सकता है।

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

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

उत्तर

16

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

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

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

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

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

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

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

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

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

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

सारांश

जब कमांड लाइन से जोड़ने, केवल cbproj टैग (इन पांच में से) कोई असर है कि LinkPackageStatics में जोड़ने के लिए (objfiles अनुभाग में जोड़ने के लिए libs) और LinkPackageImports (libs हैं libfiles खंड)। इन टैग की सामग्रियों को AllPackageLibs और PackageImports से आईडीई द्वारा गणना की जाती है, लेकिन यदि आप कमांड लाइन से लिंक करने की आवश्यकता है तो आप उन्हें .cbproj में मैन्युअल रूप से सेट कर सकते हैं।

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

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

+0

यह कमाल है। धन्यवाद –

0

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

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

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

+1

हाँ, आईडीई * आपके लिए सभी सही पुस्तकालयों को जोड़ने के लिए वास्तव में कड़ी मेहनत करता है, लेकिन कभी-कभी इसे सही नहीं मिलता है और आपको पुस्तकालय को cbproj फ़ाइल में स्वयं जोड़ना होगा। –

संबंधित मुद्दे