2012-08-16 14 views
13

मैं एक परियोजना में एक नया करने के लिए मुझे लिंकर त्रुटि के साथ मैं काम कर रहा हूँ हो रही है:LNK2022 मेटाडाटा आपरेशन: डुप्लिकेट प्रकार में असंगत लेआउट जानकारी

1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<char,std::char_traits<char>,std::allocator<char> >): (0x0200004e). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >): (0x02000075). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000091). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_const_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000092). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<char,std::allocator<char> >): (0x02000097). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<wchar_t,std::allocator<wchar_t> >): (0x02000099). 

हम Windows में दृश्य स्टूडियो 2010 का उपयोग कर रहे 7.

यह प्रोजेक्ट संकलित करने के लिए उपयोग किया जाता है। यह कुछ अप्रबंधित कोड के आसपास एक सी ++/सीएलआई डीएलएल रैपर है, और इस प्रकार आम भाषा रनटाइम समर्थन शामिल है। में की बात यह है कि एक बाहरी स्थैतिक लाइब्रेरी जिसे हमने लिंक किया था "अद्यतन" था। जब हम उस परियोजना को संकलित करने का प्रयास करते हैं तो हम अब यह त्रुटि प्राप्त कर रहे हैं।

माइक्रोसॉफ्ट के इस समस्या के लिए "सहायता" "चलाने ILDASM -tokens वस्तु फ़ाइलों पर लगाने के लिए जो प्रकार ERROR_MESSAGE में सूचीबद्ध टोकन है, और मतभेद के लिए देखो" है। फिर मैंने this page चेक किया और देखा कि /tokens विकल्प केवल .exe और .dll फ़ाइलों के लिए मान्य है ... लेकिन यह एक लिंकर त्रुटि है, इसलिए मेरी .dll फ़ाइल अभी तक नहीं बनाई गई है!

मैं ildasm -tokens AssemblyInfo.obj तरह बातें चल की कोशिश की है, लेकिन केवल बात यह है कि ऐसा होता है कि एक खिड़की इस अविश्वसनीय रूप से उपयोगी त्रुटि संदेश के साथ खुल जाता है:

Thanks Microsoft

धन्यवाद माइक्रोसॉफ्ट!

मुझे सच में यकीन नहीं है कि इस समस्या का निवारण कैसे जारी रखें। एक रिलीज बिल्ड ठीक तरह से काम करता है - यह केवल डीबग है जो गड़बड़ है। तो मिश्रण में कहीं मुझे लगता है कि std::string प्रकार एक अलग आकार या कुछ है ...

कोई विचार?

+3

मैं कभी कभी जब मैं एक हेडर फाइल को बदलने के इस त्रुटि मिलती है, और संकलक सभी कोड फ़ाइलों को पुन: संकलित नहीं करता है। आप शायद पहले से ही यह कर चुके हैं, लेकिन एक स्वच्छ और पूर्ण पुनर्निर्माण मदद कर सकता है। –

+0

@ डेविड यॉ सिफारिश के लिए धन्यवाद - मैं बिना किसी सफलता के पूर्ण पुनर्निर्माण कर रहा हूं। मुझे लगता है कि मैं यहां कुछ के निशान पर हूं ... – aardvarkk

उत्तर

13

ठीक है, इसलिए मैंने इसे हल किया! another SO question था जो वास्तव में एक बड़ी मदद थी। यह this article से जुड़ा हुआ है, जिसकी समस्या के बारे में थोड़ी अधिक जानकारी थी। असल में यह कुछ लाइब्रेरी स्ट्रिंग्स के साथ कुछ समस्या है जो प्रबंधित और अप्रबंधित कोड दोनों में संकलित हो रही है। समाधान केवल उन फ़ाइलों पर सीएलआर सक्षम करना था, जिनकी आवश्यकता थी। विस्तार में, यहाँ मैं क्या किया है:

  1. निकाला गया /clr स्विच जो पूरी परियोजना
  2. चयनित दो .cpp फ़ाइलों है कि वास्तव में CLR आवश्यकता है, और मैन्युअल रूप से C/C++ -> General -> Common Language RunTime Support तहत /clr चयनित करने के लिए आवेदन किया।
  3. से पूरे प्रोजेक्ट को Program Database /Zi पर स्विच किया गया। यह चेतावनियों से छुटकारा पा लिया, क्योंकि मुझे लगता है कि /clr समर्थन वृद्धिशील लिंकिंग को अक्षम करने के लिए दिखाई दिया, और फिर मेरा मूल कोड चेतावनी फेंक रहा था क्योंकि यह संपादन और जारी रखने का प्रयास कर रहा था।
  4. मैं तो कुछ ExtensionAttribute चेतावनी है, जो मैं this page पर निर्देशों का पालन, प्रभावी रूप से मेरी /clr -सक्षम फ़ाइलों के लिए निम्न स्विच जोड़कर तय हो गया है: /clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  5. डीबग बनाता में, मैं पर डिबग विकल्पों में से एक गुच्छा को निष्क्रिय करने के लिए किया था /clr - सक्षम फ़ाइलें। विशेष रूप से, C/C++ -> Code Generation के तहत, मैंने Enable Minimal Rebuild को No (/RM-) पर सेट किया है, और Basic Runtime Checks से Default पर सेट किया है। यह भी चेतावनियों का एक गुच्छा से छुटकारा पा लिया।
  6. डीबग और रिलीज बिल्ड में, Enable C++ ExceptionsNo पर clr -enabled फ़ाइलों पर सेट करें।

उम्मीद है कि इससे मदद मिलती है!

+0

मुझे एक ही समस्या है, लेकिन मेरे मामले में के संदर्भ में प्रबंधित फ़ाइल में भी होना चाहिए (जब तक कि हम अपना एपीआई नहीं बदलते)। क्या इस मुद्दे के आसपास कोई और रास्ता है? – Kohanz

+1

एकमात्र चीज जिसे मैं अनुशंसा कर सकता हूं वह किसी भी तरह से गतिशील रूप से लिंक्ड लाइब्रेरी के उपयोग के माध्यम से आपके प्रबंधित/अप्रबंधित कोड को विभाजित करने का प्रयास कर रहा है? यह मेरे लिए काम करने के लिए हुआ, लेकिन मुझे यकीन नहीं है कि यह कितना अच्छा है ... – aardvarkk

+0

मैं इसे पहले से ही कर रहा था (लेकिन फिर भी यह एक अच्छी टिप है)। जैसा कि आपने देखा, मैं गलती से प्रबंधित पुस्तकालय को अनियंत्रित अप्रबंधित पुस्तकालयों से जोड़ रहा था, अनिवार्य रूप से एलएनके 2022 का कारण बन रहा था। – Kohanz

2

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

+0

मेरे मामले में मैंने पहले इसे VS2013 में बनाये जाने के बाद। Vcxproj को VS2015 में अपग्रेड किया था। स्वच्छ -> इसे ठीक से पुनर्निर्माण करें। –

+0

मेरे लिए बस पुनर्निर्माण काम किया ... –

1

मेरे लिए ठीक विन्यास गुण सेट करने के लिए था -> C/C++ -> कोड पीढ़ी -> Struct सदस्य संरेखण -> 16 बाइट्स (/ Zp16)

+0

इस समाधान ने मेरे द्वारा एक समान समस्या हल की, अर्थात् डुप्लिकेट प्रकारों में असंगत क्षेत्र घोषणाएं – Aak

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