2015-02-20 6 views
9

मैं, केवल डीबग 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 स्रोत से पुनर्निर्माण करने में असफल हो सकता है, और बस पूर्व संकलन के डीसीयू को जोड़ सकता है।

enter image description here

सी अगर मैं यह गलत के बारे में जा रहा हूँ, कैसे बजाय, मैं घटक पुस्तकालय कोड के 25 लाख से अधिक लाइनों स्रोत से हर बार मैं अपने BigApp, बजाय केवल लिंक का निर्माण संकलित होने से रोकने जाएगा उन्हें डीसीयू के माध्यम से, और अभी भी डीबग और रिलीज dcus ठीक से काम है?

डी। यदि मैं Win32 \ Debug फ़ोल्डर में जाता हूं और IdGlobal.dcu को हटाता हूं तो मैं मूल त्रुटि को प्राप्त कर सकता हूं। यह मुझे बताता है कि मेरा पैकेज संकलन (डीबग कॉन्फ़िगरेशन के लिए) एक INVALID IdGlobal.dcu का उत्पादन कर रहा है। क्या यह भी संभव है? डेल्फी चुपचाप डीसीयू गले लगा सकते हैं?

नोट्स: मैं उपयोग नहीं कर रहा हूं, और एप्लिकेशन आकार की समस्याओं से निपटने के लिए रनटाइम पैकेज का उपयोग नहीं कर सकता।

अद्यतन: पहली चीज़ जो मुझे यहां करनी चाहिए वह सत्यापित है कि शून्य अतिरिक्त डीसीयू फाइलें मेरे हार्डड्राइव पर कहीं भी हैं, कहीं भी। यह मानक F2051 त्रुटि सलाह है। मैंने इसका ख्याल रखने के बाद इस सवाल को अपडेट कर दूंगा। ऐसा लगता है कि डेल्फी स्वयं एक डीसीयू को एक स्थान से दूसरे स्थान पर ले जायेगा, या एक फर्जी डीसीयू जो वर्तमान खोज पथ में नहीं है, शायद किसी अन्य प्रोजेक्ट के खोज पथ में हो सकता है। खराब-डीसीयू-प्रतियों की एक प्रकार की बाल्टी-ब्रिगेड हो सकती है। एक बार मुझे यकीन है कि मैं किस प्रकार की बुरी-डीसीयू-पीढ़ी-या-प्रतियां उत्पन्न कर रहा हूं, मैं इस सवाल को अपडेट कर दूंगा।

अद्यतन 2: अब मैंने गारंटी दी है कि इमारत से पहले IdGlobal.dcu की कोई अतिरिक्त प्रतियां मौजूद नहीं हैं, और समस्या अभी भी पुन: उत्पन्न होती है। तो सवाल तब IdGlobal.dcu बनाने के दौरान उपयोग किए गए कंपाइलर विकल्पों को चालू करता है, डीबग बिल्ड में BigApp.dproj का निर्माण करते समय उपयोग किए गए कंपाइलर विकल्पों का संस्करण।

अद्यतन 3: हालांकि मेरे सभी पैकेज संकलन त्रुटि के बिना पूरा होने लगते हैं, ऐसा लगता है कि वे सही पुस्तकालय खोज पथ का उपयोग नहीं कर रहे थे, उस समय के दौरान जब पैकेज बनाने के लिए DCC32.exe या MSBUILD.exe लॉन्च किया जा रहा है। यह लाइब्रेरी पथ असंगतता मुद्दा मुख्य मुद्दा प्रतीत होता है, सर रूफो को यह इंगित करने के लिए धन्यवाद।

+8

दिखाया मुझे लगता है कि कुछ डिबग "उपयोग डीबग-DCU" के साथ संकलित इकाइयों देखते हैं सेट और दूसरों CodeGear.Delphi.Targets XE7 से की परिवर्तन कर रहे हैं नहीं हैं। यदि सेट किया गया है तो संकलक डीसीयू फाइलों का उपयोग 'डीबग-डीसीयू-पथ' से करता है। तो अब आप तीसरे पक्ष डीबग-डीसीयू के साथ संकलित कुछ हैं और कुछ नहीं हैं। –

+0

आप इतने अच्छे क्यों हैं? मैंने कभी यह नहीं समझा है। अपने कंपाइलर का उपयोग क्यों न करें। –

+0

क्योंकि बीडीएस.एक्सई आईडीई 32 बिट कंपाइलर का उपयोग करता है और यह लगभग 2 जीबी मेमोरी का उपभोग कर रहा है। यह बड़ा पता नहीं है, और यह स्मृति से बाहर हो रहा है। उसमें से लगभग 800 मेग्स स्रोत से सब कुछ बनाने के दृष्टिकोण से उत्पन्न होता है, और जब यह प्रतीकों को लोड करता है तो शेष डिबगर द्वारा उपभोग किया जाता है। –

उत्तर

1

अब मैं इस समस्या के लिए एक स्रोत को समझता हूं। कृपया सर रूफो को ऊपर उठाएं क्योंकि उसने मुझे समाधान के बारे में बताया है।

यह है: मैं संकुल संकलित करने के लिए DCC32.exe का आविष्कार कर रहा था (.dpk का उपयोग कर रहा हूं, लेकिन कोई .dproj फ़ाइल नहीं, और इन संकुलों को संकलित करने के लिए msbuild का आह्वान नहीं कर रहा)। जब मैंने इन्हें बनाया, तो मैं -I पैरामीटर DCC32.exe पर पारित लाइब्रेरी पथ के सिर पर डीबग डीसीयू पथ नहीं डाल रहा था।

एक बार DCC32.exe पैकेज संकलन लाइब्रेरी सर्च पथ में डीबग डीसीयू फ़ोल्डर्स पहले है, यह काम करता है।

यदि कोई इस तरह के पैकेज सिस्टम में रूचि रखता है, तो मैं मूल रूप से जुंकरलो एनेज़ द्वारा निर्मित वेंट परियोजना के पुन: लॉन्च के हिस्से के रूप में इस पैकेज निर्माण प्रणाली को खोलने की योजना बना रहा हूं, जिसे मैं शायद एक नए नाम से बुलाऊंगा। एक घटक निर्माण प्रणाली के कामकाजी डेमो उपलब्ध होने के बाद मैं इस जवाब को अपडेट कर दूंगा।

एक काम कर प्रणाली का एक संक्षिप्त रूपरेखा आवश्यकताओं मैं अपने सवाल में पूछा पूरा करने के लिए:

  1. आप एक फ़ाइल की आवश्यकता होगी (xml, आरं, json फ़ाइल हो सकता है) कि संकुल की एक सूची के लिए परिभाषित करता है निर्माण।

  2. आप इन में से प्रत्येक पर MSBuild या DCC32.exe आह्वान करने के लिए की आवश्यकता होगी। आप अपना कोड लिख सकते हैं, या आप मेरा उपयोग कर सकते हैं, जो मैं कर सकता हूं जब मैं स्रोत खोलूंगा।

  3. आपको डीबग डीसीयू डीपीआरजे को पहले आइटम के रूप में लाइब्रेरी पथ में शामिल करने की आवश्यकता होगी, केवल डीबग आइटम का निर्माण करते समय।

  4. आप अपने प्रोजेक्ट सर्च पथ और लाइब्रेरी पथ में $(OURCOMPANYLIBRARYDCU)\$(Platform)\$(Config) मैक्रो का उपयोग करना चाहेंगे।

  5. अपने डेल्फी आईडीई में, आप पुस्तकालय पथ के भीतर एक पथ के रूप में $(OURCOMPANYLIBRARYDCU)\$(Platform)\Release हार्ड कोड कोड करना चाहते हैं।

  6. अपने डेल्फी आईडीई में, आप डीबग डीसीयू पथ के भीतर एक पथ के रूप में $(OURCOMPANYLIBRARYDCU)\$(Platform)\Debug हार्ड कोड कोड करना चाहते हैं।

+0

http://stackoverflow.com/questions/28425456/what-project-options-to-use-for-open-source-delphi-packages/28429240#28429240 –

+0

विकल्प विकल्प से कुछ दिन पहले पथ को लक्षित करने का एक समान प्रश्न था जवाब काफी उपयोगी हो सकता है! धन्यवाद –

8

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

  • अनुवादित लाइब्रेरी पथ (डेल्फी-विकल्प - पुस्तकालय

    1. लाइब्रेरी पथ:

      आईडीई में कई स्थानों पर आप खोज pathes निर्दिष्ट कर सकते हैं जहां कर रहे हैं अनूदित)

    2. डीबग DCU पथ (डेल्फी-विकल्प - लाइब्रेरी)
    3. अनुवादित डीबग डीसी यू पथ (डेल्फी-विकल्प - लाइब्रेरी-अनूदित)
    4. खोजें पथ (परियोजना विकल्प के माध्यम से)

    लाइब्रेरी भाषा अंग्रेज़ी पर सेट किया जाता है, उन pathes संकलक करने के क्रम 5 में दिए गए हैं , की सेटिंग के आधार पर 1 या 3,5,1 डीबग का उपयोग करें। डीकस। यह पहले से ही थोड़ा अजीब है क्योंकि डीबग डीसीयू पथ परियोजना खोज पथ पर प्राथमिकता लेता है।

    तो f.i. कंपाइलर को एक नए इंडी संस्करण की अपनी डीसीयू फाइलें खोजने के लिए, हमें 1 और 3 के तहत पैच के सामने संबंधित पट्टियां रखना होगा।

    अब चीजें जटिल होती हैं जब लाइब्रेरी भाषा कुछ अलग से सेट होती है अंग्रेज़ी। इस मामले में अनुवादित पट्टियां खेल में आती हैं जिसके परिणामस्वरूप की सेटिंग के आधार पर क्रमशः 2,5,1 या 4,3,2,5,1 क्रमशः डीबग का उपयोग करें। डीकस

    एक नए इंडी संस्करण काम के साथ ऊपर के उदाहरण के लिए, आपको अनुवाद pathes बदलाव करने, भी है।

    अपराधी कोडगियर। डेल्फी। लक्ष्य, जो इस क्रम में पैट रखता है। मैं इस फ़ाइल को संशोधित करने में सक्षम था ताकि पैच का प्राकृतिक क्रम उपयोग किया जा सके: 5,2,1 या 5,4,3,2,1। अगर कोई यह पुष्टि कर सकता है कि मुझे इन बदलावों को दिखाने की अनुमति है तो मैं करूँगा। शायद मैं केवल एक पैच प्रदान कर सकता हूं।

    अद्यतन: यहाँ के रूप में द्वारा मर्क्युरियल

    @@ -122,20 +122,19 @@ 
        <DcpFilename Condition="'$(DcpFilename)'!='' And !HasTrailingSlash('$(DcpFilename)')">$(DcpFilename)\</DcpFilename> 
        <DcpFilename Condition="'$(DcpFilename)'!=''">$(DcpFilename)$(MSBuildProjectName).dcp</DcpFilename> 
    
    - <UnitSearchPath Condition="'$(DCC_UnitSearchPath)' != ''">$(DCC_UnitSearchPath);$(DelphiLibraryPath)</UnitSearchPath> 
    - <UnitSearchPath Condition="'$(DCC_UnitSearchPath)' == ''">$(DelphiLibraryPath)</UnitSearchPath> 
    - 
    + <UnitSearchPath>$(DelphiLibraryPath)</UnitSearchPath> 
        <UnitSearchPath Condition="'$(DCC_TranslatedLibraryPath)' != ''">$(DCC_TranslatedLibraryPath);$(UnitSearchPath)</UnitSearchPath> 
        <UnitSearchPath Condition="'$(DCC_DebugDCUs)'=='true' And '$(DelphiDebugDCUPath)'!=''">$(DelphiDebugDCUPath);$(UnitSearchPath)</UnitSearchPath> 
        <UnitSearchPath Condition="'$(DCC_DebugDCUs)'=='true' And '$(DCC_TranslatedDebugLibraryPath)' != ''">$(DCC_TranslatedDebugLibraryPath);$(UnitSearchPath)</UnitSearchPath> 
    - 
    + <UnitSearchPath Condition="'$(DCC_UnitSearchPath)' != ''">$(DCC_UnitSearchPath);$(UnitSearchPath)</UnitSearchPath> 
    +  
        <___ResourcePath Condition="'$(DCC_ResourcePath)' != ''">$(DCC_ResourcePath);$(DelphiLibraryPath)</___ResourcePath> 
        <___ResourcePath Condition="'$(DCC_ResourcePath)' == ''">$(DelphiLibraryPath)</___ResourcePath> 
    + <___ResourcePath Condition="'$(DCC_TranslatedResourcePath)' != ''">$(DCC_TranslatedResourcePath);$(___ResourcePath)</___ResourcePath> 
        <__ResourcePath Condition="'$(DCC_UnitSearchPath)' != ''">$(DCC_UnitSearchPath);$(___ResourcePath)</__ResourcePath> 
        <__ResourcePath Condition="'$(DCC_UnitSearchPath)' == ''">$(___ResourcePath)</__ResourcePath> 
        <ResourcePath Condition="'$(BRCC_OutputDir)' != ''">$(BRCC_OutputDir);$(__ResourcePath)</ResourcePath> 
        <ResourcePath Condition="'$(BRCC_OutputDir)' == ''">$(__ResourcePath)</ResourcePath> 
    - <ResourcePath Condition="'$(DCC_TranslatedResourcePath)' != ''">$(DCC_TranslatedResourcePath);$(ResourcePath)</ResourcePath> 
    
        <NameSpace Condition="'DelphiNamespaceSearchPath'!=''">$(NameSpace);$(DelphiNamespaceSearchPath)</NameSpace> 
    
  • +2

    मुझे लगता है कि यह लक्ष्य फ़ाइल एक कॉन्फ़िगरेशन फ़ाइल है और इसलिए आप इसका एक स्निपेट दिखाने में सक्षम होना चाहिए। वीसीएल का एक छोटा सा स्निपेट भी एक या दो लाइनों को दिखाने के लिए उचित उपयोग कानूनों के भीतर है। –

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