2011-11-11 10 views
5

मैं विज़ुअल सी ++ 2008 एक्सप्रेस पर कुलपति ++ 6 कार्यक्षेत्र परिवर्तित करने के बाद एक आवेदन का निर्माण कर रहा हूँ वितरित करने के लिए कैसे। बिल्ड ही सफलतापूर्वक चला जाता है, लेकिन वास्तविक समस्या मेरे पास है उत्पन्न प्रकट होता है जो इस तरह दिखता है के साथ है:सी चलाने के समय (सीआरटी) पुस्तकालय

<?xml version='1.0' encoding='UTF-8' standalone='yes'?> 
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level='asInvoker' uiAccess='false' /> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.30729.1' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> 
    </dependentAssembly> 
    </dependency> 
</assembly> 

मेरा प्रश्न है:

कैसे मैं केवल एक संस्करण, अधिमानतः 9.0 सूची प्रकट सीमित कर सकते हैं। 21022.8। ताकि मैं अपने आवेदन के अंदर आवश्यक सी-रन टाइम निर्भरताओं को बंडल कर सकूं?

मैं जानता हूँ कि इस समस्या के लिए संभव मूल कारण कुछ पुस्तकालय जो 9.0.21022.8 का उपयोग करता है और मेरे कुलपति एक्सप्रेस 2008 9.0.30729.1 उपयोग कर रहे हैं ++ पर निर्भरता है। यही कारण है कि दोनों निर्भरता के रूप में सूचीबद्ध हैं।

नोट:

मैं http://www.codeproject.com/Tips/211756/How-to-Distribute-C-run-time-CRT-Libraries-with-Yo?display=Print जो आवेदन फ़ोल्डर के अंदर CRT DLL फ़ाइलों और Microsoft.VCXX.CRT.manifest फ़ाइल कॉपी करने के बारे में बात की दृष्टिकोण ख) करना चाहता हूं।

+0

आपको इसे ठीक करने की आवश्यकता है। हां, एक ही संकलक सेटिंग्स के साथ सभी libs पुनर्निर्माण। –

+0

हंस टिप्पणी के आगे, यह पढ़ने योग्य है [यह] (http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio- पुस्तकालय /) जो बताता है आप लाइब्रेरी के उस संस्करण को नियंत्रित करने के बारे में थोड़ा सा है जो आपका कोड बाध्य करता है। – tinman

+0

धन्यवाद @ टिनमैन, आपके द्वारा पोस्ट किया गया लिंक मेरी समस्या का समाधान करने में मदद करता है। – amit

उत्तर

9

विजुअल स्टूडियो 2008 के लिए डिफ़ॉल्ट संस्करण 9.0.21022.8 करने के लिए बाध्य किया जा सके। यह सर्विस पैक या हॉटफिक्स स्थापित किए गए की जो भी संस्करण की परवाह किए बिना है के बाद से दृश्य स्टूडियो के लिए अद्यतन जरूरी नहीं कि (के रूप में वर्णित here) को अपग्रेड करने के लिए अपने आवेदन के लिए मजबूर करना चाहिए।

अन्य संभावित संस्करणों एक सुरक्षा अद्यतन के साथ SP1 के लिए सर्विस पैक 1 या 9.0.30729.6161 के लिए 9.0.30729.1 हैं। कुछ भी हैं।

डिफ़ॉल्ट व्यवहार के कारण

, यह है कि आपके आवेदन 9.0.21022.8 उपयोग कर रहा है और वहाँ एक पुस्तकालय जो 9.0.30729.1 उपयोग करने के लिए संकलित किया गया है है की संभावना है। आप पता लगा सकते प्रत्येक पुस्तकालय का कौन सा संस्करण पर निम्न कमांड लाइन (described here) का उपयोग करके निर्भर है:

dumpbin /directives <name>.lib 
क्रम है कि आपके आवेदन आप को बांधता है अपनी परियोजना सेटिंग्स में पूर्वप्रक्रमक प्रतीक परिभाषित कर सकते हैं की control the version करने के लिए

डिफ़ॉल्ट संस्करण (9.0.21022.8 - उन्हें परिभाषित करने नहीं द्वारा) करने के लिए या तो बाँध के लिए (परियोजना सेटिंग्स में या कमांड लाइन पर होना चाहिए) या अपने स्थापित दृश्य स्टूडियो के रूप में एक ही संस्करण के लिए बाध्य:

_BIND_TO_CURRENT_VCLIBS_VERSION=1 

स्पष्ट रूप से आप ई निर्दिष्ट भी कर सकते हैं xact संस्करण जिसे आप this answer से परिभाषित करने के लिए बाध्य करना चाहते हैं (शायद मुझे इसे सब कुछ लिखने से पहले पाया जाना चाहिए :)।

आप पाते हैं यह आपके आवेदन कि 9.0.30729.1 को बांधता है और निर्भर पुस्तकालय 9.0.21022.8 के लिए बाध्य किया जाता है, तो आप बस पूर्वप्रक्रमक परिभाषा को दूर करने की जरूरत है।

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

रनटाइम संस्करण को हल करना कोई समस्या नहीं होगी यदि आप रनटाइम नीति विलय मॉड्यूल भी वितरित करते हैं, क्योंकि लाइब्रेरी लोडर रनटाइम पर आपके रनटाइम की नीति को देखेगा और डिफ़ॉल्ट रूप से बाध्य होने पर भी नवीनतम संस्करण लोड करेगा संस्करण। यहां तक ​​कि निजी असेंबली के साथ लोडर will first look in the WinSxS folder इसलिए यदि नीतियां हैं तो आप नवीनतम संस्करण से जुड़ जाएंगे।तो आपके मैनिफेस्ट में आपके मिश्रित संस्करण संख्या दोनों नवीनतम संस्करण पर रीडायरेक्ट करेंगे।

कभी-कभी वांछित नहीं होता है और आप इसे निर्दिष्ट करने वाले मैनिफेस्ट में केवल संस्करण को लोड करने के लिए मजबूर कर सकते हैं, जिसे this similar SO question के उत्तर में समझाया गया है।

+0

+ बाउंटी: शानदार। –