2013-04-21 5 views
10

मैं वी.एस. 2012 गतिशील पुस्तकालय में (.dll) और 64 मोड के साथ एक C++/CLI परियोजना पर काम कर रहा हूँ।विजुअल स्टूडियो 2010 सी ++/स्टेटिक लाइब्रेरी मोड में CLI: नहीं पा सके विधानसभा 'mscorlib.dll'

मैं स्टेटिक लाइब्रेरी के लिए मोड स्विच करते हैं, मैं नीचे त्रुटि मिलती है।

त्रुटि 1 त्रुटि C1107: नहीं पा सके विधानसभा 'mscorlib.dll': \ डिपो \ मुख्य \ वर्तमान \ SLN \ ALibraryProject \ Stdafx: का उपयोग कर/ऐ या LIBPATH वातावरण चर सी की स्थापना द्वारा विधानसभा खोज पथ निर्दिष्ट करें सीपीपी 1 1 ALibraryProject

मैं mscorlib.dll के संदर्भ को हटाने के फिर से इसे फिर से जोड़ने की कोशिश की:

परियोजना> गुण> सामान्य> आम गुण

लेकिन वह मदद नहीं की। जैसा कि मुझे पता है कि वीएस .NET असेंबली के संदर्भ को संभालता है, मैं इसे डिस्क फ़ाइल संदर्भ जोड़ना नहीं चाहता क्योंकि यह अजीब लगता है! क्या किसी ने इससे पहले सामना किया था?

उत्तर

4

अगर मैं स्टेटिक लाइब्रेरी

यह विशिष्ट त्रुटि आप प्राप्त नहीं है करने के लिए मोड पर स्विच जब आप प्रभाव में/CLR के साथ एक स्थिर पुस्तकालय का निर्माण करने का प्रयास करें। मुझे यह मानना ​​होगा कि जब आप ऐसा करने का प्रयास करते हैं तो आपको प्राप्त होने वाली अचूक लिंकर त्रुटियों से छुटकारा पाने के लिए आप प्रोजेक्ट सेटिंग्स के साथ टंकण कर रहे हैं।

कोर मुद्दा यह है कि C++/CLI निर्माण प्रणाली स्थिर पुस्तकालयों कि MSIL शामिल का समर्थन नहीं करता है। प्रबंधित कोड एक लिंकर का उपयोग नहीं करता है, बाध्यकारी रनटाइम पर होता है। जो स्थैतिक पुस्तकालयों और डीएलएल के बीच आवश्यक अंतर गायब हो जाता है। इसलिए माइक्रोसॉफ्ट ने इसका समर्थन नहीं करने का फैसला किया क्योंकि इसे लागू करने के लिए ज्यादा समझ नहीं आया। दुर्भाग्यवश, जब भी आप इसे करने का प्रयास करते हैं तो वे जोर से चिल्लाते नहीं हैं, आपको जो लिंकर त्रुटियां मिलती हैं, वे उस संकेत के बारे में पर्याप्त संकेत नहीं देते हैं जो आपने गलत किया था। वर्कअराउंड, जैसे आईएलएमर्ज के साथ विलय करना या तो काम नहीं करता है, यह मिश्रित मोड असेंबली से निपट नहीं सकता है। मूल कोड अनुभागों और उनके संबंधित स्थानांतरण तालिका प्रविष्टियों को विलय करना बहुत ही अनैतिक है।

ध्यान रखें कि यह देशी स्थिर पुस्तकालयों से जोड़ने के लिए ठीक है। एक सामान्य सी ++/सीएलआई प्रोजेक्ट में केवल रेफ क्लास रैपर होते हैं जिन्हें प्रभाव में/clr के साथ बनाया जाना चाहिए। आप पुस्तकालयों से किसी भी मूल कोड को अंतिम असेंबली में चिपका सकते हैं।


मैं भी कई प्रोग्रामर एक और कारण यह है कि स्थिर पुस्तकालयों के निर्माण से कोई लेना देना नहीं है और उन्होंने मुझे टिप्पणी में परेशान कर रहे के लिए यह त्रुटि प्राप्त वास्तविक संकलन त्रुटि के बारे में सिद्धांत के लिए मजबूर कर रहा हूँ, ।

सावधान रहें कि आपके मशीन पर इंस्टॉल किए गए किसी भी .NET के .NET के एक अलग संस्करण को लक्षित करना काफी खतरनाक मामला है, खासकर यदि आप 4.0 को लक्षित करना चाहते हैं और आपके पास 4.5.x इंस्टॉल है। आपकी .vcxproj फ़ाइल में मुख्य तत्व <TargetFrameworkVersion> है। यह अनुपलब्ध होगा यदि आपने पुराने .NET संस्करण को लक्षित करने वाली प्रोजेक्ट शुरू की है, तो आपको इसे स्वयं डालना होगा। आईडीई भी इसे बदलने अगर यह मौजूद है का समर्थन नहीं करता, फिर हाथ से संपादित करें।

कौन सा उचित संकलन आदेश पैदा करने में MSBuild मनाना करने के लिए पर्याप्त है। आप यह सत्यापित कर सकते हैं कि वह पनड-आउट अच्छी तरह से है, अपनी परियोजना के लिए डीबग बिल्ड निर्देशिका की * .tlog उपनिर्देशिका में देखें। Cl.command.1.tlog फ़ाइल संकलक को पास किए गए विकल्पों को दिखाती है।यह शामिल करना चाहिए:

/ऐ "C: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ विधानसभाओं \ Microsoft \ Framework.NETFramework \ v4.0"
/FU "C: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ सभाओं \ Microsoft \ Framework.NETFramework \ v4.0 \ mscorlib.dll "

नोट उपनिर्देशिका, बहुत ही महत्वपूर्ण यह अपने इच्छित नेट लक्ष्य से मेल खाने। इस उदाहरण में v4.0। और बहुत, यह बहुत महत्वपूर्ण है कि सी को इंगित करता है: \ windows \ microsoft.net, संदर्भ असेंबली के लिए विरासत स्थान।

+0

जो वास्तविकता से आगे नहीं हो सकता है। मूल कोड के साथ विधानसभाओं को मर्ज करने के लिए वास्तव में बहुत आसान है (हालांकि वास्तव में इसकी अनुशंसा नहीं की जाती है) - मैंने इसे कई बार किया है, वास्तव में मेरे काम के हिस्से में सीएलआर-असेंबली में मूल कोड शामिल है - लेकिन उन्हें विलय करने से मुझे एक और बिल्ड-चरण जोड़ने के साथ छोड़ दिया गया जो मैं टालना चाहता था ... इसलिए मैंने प्रत्येक असेंबली को अलग-अलग संदर्भित करने का पारंपरिक तरीका चुना। – specializt

+0

... और सी ++/सीएलआई के बारे में एक हिस्सा "इंटरऑप भाषा" होने का कोई मतलब नहीं है। मेथिंक आपको अपने चुने हुए विषयों का थोड़ा सा शोध करने की ज़रूरत है। (माइक्रोसॉफ्ट) इंटरऑप के पास भाषा-विनिर्देशों के साथ कुछ भी नहीं है, कोई भी "इंटरऑप भाषा" नहीं हो सकती है - इंटरपॉप भाषाओं के बीच एक ब्रिज के कुछ हद तक है। कृपया अपनी धारणाओं और कल्पनाओं को न बताएं जैसे कि वे कठिन तथ्य हैं ... – specializt

+1

आप ranting हैं। इसके बजाय एक उत्तर पोस्ट करें। –

4

मुझे एक ही समस्या है। एक डीएल होने से काम नहीं होता है, क्योंकि मुझे किसी .NET ऑब्जेक्ट के लिए देशी सी ++ रैपर प्रदान करने की आवश्यकता होती है, इसलिए यह एक नेटिस सी ++ इंटरफ़ेस को पूरा कर सकता है - मैं एक डीएल इंटरफ़ेस में .NET का उपयोग नहीं कर सकता - यह एक संकलन त्रुटि देता है

यह वीएस 2010 (.net 4 के साथ) में एक स्थिर पुस्तकालय के रूप में काम करता है

मेरे कुछ निष्पादन योग्य और डीएलएस जिनमें कुछ कोड/clr भी है। उन्हें कोई समस्या नहीं है। मैं नेट लाइबरी बनाने की कोशिश नहीं कर रहा हूं।

33

वीएस -2010 कंपाइलर से वीएस2013 कंपाइलर में अपना समाधान परिवर्तित करते समय मुझे वही समस्या थी।

मैंने प्रोजेक्ट सेटिंग्स को बदलकर इसे हल किया है (इस त्रुटि को फेंकने वाली प्रबंधित .cpp फ़ाइल वाली परियोजना के लिए): प्रोजेक्ट सेटिंग्स | सी/सी ++ | सामान्य | अतिरिक्त #using निर्देशिकाएं मैंने मैक्रो $ (फ्रेमवर्कपाथ ओवरराइड) जोड़ा। यह आपके द्वारा लक्षित किए जा रहे .NET के संस्करण के लिए संदर्भ असेंबली निर्देशिका का समाधान करता है, जो मेरे मामले में सी: \ प्रोग्राम फ़ाइलें (x86) \ संदर्भ असेंबली \ Microsoft \ Framework.NETFramework \ v4.5.1

+0

वीएस -2010 से वीएस2015 तक अपग्रेड करते समय भी वही बात हुई। मुझे यकीन नहीं है कि ** Win32 ** कॉन्फ़िगरेशन में ** $ (FrameworkPathOverride) ** पहले से ही क्यों था, लेकिन मुझे इसे ** x64 ** कॉन्फ़िगरेशन में जोड़ना पड़ा। – skst

0

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

इसे ढूंढना आसान नहीं था, क्योंकि त्रुटि स्पष्ट नहीं है, और निर्भरता परियोजना सेटिंग्स में "अतिरिक्त निर्भरता" के माध्यम से स्थापित की गई थी।

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