मैं, केवल डीबग config में उत्पन्न केवल मामले में नीचे वर्णित इस संकलन त्रुटि को हल करने की कोशिश कर रहा हूँ, और:डीबग की एक लाइब्रेरी का उपयोग डेल्फी में बहुत बड़ी codebases प्रबंध और नियमित रूप से DCUs मैं अपने आप को बनाया
[dcc32 Fatal Error] MyIndyTCPChannel.pas(22): F2051 Unit IdIOHandlerSocket was compiled with a different version of IdGlobal.IdDisposeAndNil
मैं एक बहुत बड़े डेल्फी कोडेबेस पर काम कर रहा हूं, 2.5 मिलियन लाइनों के इन-हाउस कोड और 3 मिलियन लाइनों के घटक कोड, जिसमें कई बड़े वाणिज्यिक डेल्फी घटक सूट (डेवलपर एक्सप्रेस, टीचर्ट, और अन्य) शामिल हैं, और बड़ी संख्या में ओपन सोर्स डेल्फी घटकों के साथ-साथ, घटकों के काफी बड़े घर के विकसित सेट, 252 पैकेजों की संख्या, जिनमें से 140 डिजाइनटाइम + रनटाइम या डिज़ाइनटाइम हैं, और अन्य रनटाइम पैकेज हैं (जिन्हें भी लोड किया जाता है, मैं रनटाइम पर आईडीई पर, उनके संबंधित डिज़ाइनटाइम पैकेज में डीएलएल-निर्भरताओं द्वारा)।
हमारा मुख्य लाइब्रेरी पथ को छोटा होने के लिए अनुकूलित किया गया है, और इसमें पथ जो डेल्फी जहाजों के मानक के साथ हैं, साथ ही तीन और जोड़े गए हैं, प्राथमिक एक एकल "OurCompanyLibraryDCU" फ़ोल्डर है, जिसमें शामिल है
c:\dev\OurCompanyLibraryDCU\Win32\Release
c:\dev\OurCompanyLibraryDCU\Win32\Debug
c:\dev\OurCompanyLibraryDCU\Win64\Release
c:\dev\OurCompanyLibraryDCU\Win32\Debug
उपरोक्त फ़ोल्डरों से प्रत्येक कि मंच/config संयोजन के लिए, एक ही फ़ोल्डर में गरीबी रेखा से नीचे, डीसीपी, और DCU फ़ाइलों का सेट होता है: नीचे यह दो प्लेटफार्मों और दो विन्यास है कि हम का उपयोग के लिए फ़ोल्डर।
निम्नलिखित की तरह एक मैक्रो, परियोजना के लिए विकल्पों में प्रयोग किया जाता है, तो हम मंच को बदल सकते हैं, और config, और निर्देशिका सही ढंग से हल किया है:
$(OURCOMPANYLIBRARYDCU)\$(Platform)\$(Config)
OURCOMPANYLIBRARYDCU
एक वातावरण चर रहा है और $(X)
है डेल्फी आईडीई के संदर्भ में, पर्यावरण चर का विस्तार करने के लिए वाक्यविन्यास।
मैं सबसे महत्वपूर्ण और सबसे बड़ी वीसीएल एप्लिकेशन प्रोजेक्ट (इसे BigApp.dproj कहता हूं) प्राप्त करने की कोशिश कर रहा हूं ताकि परियोजना खोज निर्देशिका में केवल हमारे आवेदन स्रोत फ़ोल्डर्स हों और हमारे सभी को शामिल करने के लिए प्रोजेक्ट सर्च पथ की आवश्यकता न हो तृतीय पक्ष घटक पुस्तकालय स्रोत कोड। ऐसा करने के लिए, हमें डीसीयू डीब्यू के खिलाफ लिंक करने या डीसीयू जारी करने की आवश्यकता है।
अब तक हमारे पास सबकुछ काम कर रहा है, जहां आपके पास डीबग और रिलीज डीसीयू दोनों उपलब्ध हैं। रिलीज डीसीयू लाइब्रेरी पथ में हैं, और आईडीई सेटिंग्स में डीबग डीसीयू डीबग डीसीयू पथ में हैं। इन दो पुस्तकालयों के बीच चुनाव के साथ सामना करते हुए, डेल्फी का लिंकर असफल प्रतीत होता है, जब भी डीसीयू के दोनों सेट मौजूद होते हैं, इस फ़ॉर्म में त्रुटियों के साथ, जब मैं बिल्ड पर क्लिक करता हूं, और Build Configuration
रिलीज पर सेट होता है, तो मुझे F2051 त्रुटियां मिलती हैं। F2051 त्रुटि का सामान्य कारण यह है कि कई असंगत बाइनरी डीसीयू मौजूद हैं और दोनों पहुंच योग्य हैं, और लिंकर इसे सभी काम करने में विफल रहा है। हालांकि, जब आप लाइब्रेरी पथ दोनों में डीबग और रिलीज डीसीयू दोनों चाहते हैं, तो मैंने सोचा कि इस तरह की चीज नहीं होगी, क्योंकि लिंकर डीबग चुनने या आपके लिए डीसीयू जारी करने के कारण होता है।
यदि मैंने डीबग डीसीयू का निर्माण नहीं किया है, तो उपरोक्त समस्या नहीं होती है। मुझे संदेह है कि मेरे डीबग डीसीयू कम से कम "अमान्य" हैं या डेल्फी के अंदर डीबग-डीसीयू-चयन एल्गोरिदम काम नहीं कर रहा है, लेकिन इस बारे में कोई जानकारी नहीं है कि क्यों, या इसे कैसे ठीक किया जाए।
एकाधिक भाग-प्रश्न:
ए एक मंच/config संयोजन के लिए एक ही फ़ोल्डर चल रहा है, एक ही फ़ोल्डर में DCU, गरीबी रेखा से नीचे है, और डीसीपी युक्त, और फिर आईडीई लाइब्रेरी में जाना जाता पथ को जोड़ा गया समस्याओं का कारण बनने के लिए? क्या मुझे तीन सब-फ़ोल्डरों की आवश्यकता है, प्रत्येक प्लेटफ़ॉर्म + कॉन्फ़िगर + फ़ाइल प्रकार के लिए कुल 12 फ़ोल्डर्स बनाना, या क्या मैं उन्हें प्लेटफ़ॉर्म + कॉन्फ़िगरेशन द्वारा एक साथ रख सकता हूं?
बी। पैकेज संकलन स्थिति में, क्या आईडीई लाइब्रेरी पथ में OurCompanyLibraryDCU फ़ोल्डर है, और यह फ़ोल्डर भी डीसीपी आउटपुट निर्देशिका, पैकेज आउटपुट निर्देशिका, और यूनिट आउटपुट निर्देशिका के रूप में कॉन्फ़िगर किया गया है? मेरी चिंता यह है कि इनपुट फ़ोल्डर और आउटपुट फ़ोल्डर्स समान होने पर, ऐसा कोई मामला है जहां संकलक एक इकाई को .pas स्रोत से पुनर्निर्माण करने में असफल हो सकता है, और बस पूर्व संकलन के डीसीयू को जोड़ सकता है।
सी अगर मैं यह गलत के बारे में जा रहा हूँ, कैसे बजाय, मैं घटक पुस्तकालय कोड के 25 लाख से अधिक लाइनों स्रोत से हर बार मैं अपने BigApp, बजाय केवल लिंक का निर्माण संकलित होने से रोकने जाएगा उन्हें डीसीयू के माध्यम से, और अभी भी डीबग और रिलीज dcus ठीक से काम है?
डी। यदि मैं Win32 \ Debug फ़ोल्डर में जाता हूं और IdGlobal.dcu को हटाता हूं तो मैं मूल त्रुटि को प्राप्त कर सकता हूं। यह मुझे बताता है कि मेरा पैकेज संकलन (डीबग कॉन्फ़िगरेशन के लिए) एक INVALID IdGlobal.dcu का उत्पादन कर रहा है। क्या यह भी संभव है? डेल्फी चुपचाप डीसीयू गले लगा सकते हैं?
नोट्स: मैं उपयोग नहीं कर रहा हूं, और एप्लिकेशन आकार की समस्याओं से निपटने के लिए रनटाइम पैकेज का उपयोग नहीं कर सकता।
अद्यतन: पहली चीज़ जो मुझे यहां करनी चाहिए वह सत्यापित है कि शून्य अतिरिक्त डीसीयू फाइलें मेरे हार्डड्राइव पर कहीं भी हैं, कहीं भी। यह मानक F2051 त्रुटि सलाह है। मैंने इसका ख्याल रखने के बाद इस सवाल को अपडेट कर दूंगा। ऐसा लगता है कि डेल्फी स्वयं एक डीसीयू को एक स्थान से दूसरे स्थान पर ले जायेगा, या एक फर्जी डीसीयू जो वर्तमान खोज पथ में नहीं है, शायद किसी अन्य प्रोजेक्ट के खोज पथ में हो सकता है। खराब-डीसीयू-प्रतियों की एक प्रकार की बाल्टी-ब्रिगेड हो सकती है। एक बार मुझे यकीन है कि मैं किस प्रकार की बुरी-डीसीयू-पीढ़ी-या-प्रतियां उत्पन्न कर रहा हूं, मैं इस सवाल को अपडेट कर दूंगा।
अद्यतन 2: अब मैंने गारंटी दी है कि इमारत से पहले IdGlobal.dcu की कोई अतिरिक्त प्रतियां मौजूद नहीं हैं, और समस्या अभी भी पुन: उत्पन्न होती है। तो सवाल तब IdGlobal.dcu बनाने के दौरान उपयोग किए गए कंपाइलर विकल्पों को चालू करता है, डीबग बिल्ड में BigApp.dproj का निर्माण करते समय उपयोग किए गए कंपाइलर विकल्पों का संस्करण।
अद्यतन 3: हालांकि मेरे सभी पैकेज संकलन त्रुटि के बिना पूरा होने लगते हैं, ऐसा लगता है कि वे सही पुस्तकालय खोज पथ का उपयोग नहीं कर रहे थे, उस समय के दौरान जब पैकेज बनाने के लिए DCC32.exe या MSBUILD.exe लॉन्च किया जा रहा है। यह लाइब्रेरी पथ असंगतता मुद्दा मुख्य मुद्दा प्रतीत होता है, सर रूफो को यह इंगित करने के लिए धन्यवाद।
दिखाया मुझे लगता है कि कुछ डिबग "उपयोग डीबग-DCU" के साथ संकलित इकाइयों देखते हैं सेट और दूसरों CodeGear.Delphi.Targets XE7 से की परिवर्तन कर रहे हैं नहीं हैं। यदि सेट किया गया है तो संकलक डीसीयू फाइलों का उपयोग 'डीबग-डीसीयू-पथ' से करता है। तो अब आप तीसरे पक्ष डीबग-डीसीयू के साथ संकलित कुछ हैं और कुछ नहीं हैं। –
आप इतने अच्छे क्यों हैं? मैंने कभी यह नहीं समझा है। अपने कंपाइलर का उपयोग क्यों न करें। –
क्योंकि बीडीएस.एक्सई आईडीई 32 बिट कंपाइलर का उपयोग करता है और यह लगभग 2 जीबी मेमोरी का उपभोग कर रहा है। यह बड़ा पता नहीं है, और यह स्मृति से बाहर हो रहा है। उसमें से लगभग 800 मेग्स स्रोत से सब कुछ बनाने के दृष्टिकोण से उत्पन्न होता है, और जब यह प्रतीकों को लोड करता है तो शेष डिबगर द्वारा उपभोग किया जाता है। –