2011-04-06 13 views
5

क्षमा करें यह सवाल के साथ किसी को भी परेशान करने के लिए है, लेकिन मैं अभी तक कोई संकल्प के साथ घंटों के लिए इस शोध किया गया है,:LNK2022 और LNK2034 सीआरटी के संस्करण 10.0 के साथ लिंकर त्रुटियों

मैं करने के लिए एक नहीं बल्कि बड़े पैमाने पर आवेदन पोर्टिंग हूँ विजुअल स्टूडियो 2010 में 10.0 सीआरटी (कंपाइलर)। ऐप को सी ++/सीएलआई प्रबंधित किया जाता है जो/clr का उपयोग करता है। अधिकांश कोड देशी (9 5%) हैं, इसमें कुछ प्रबंधित भाग यहां और वहां हैं।

तो मेरा काम नया 10.0 सीआरटी (यानी कंपाइलर) को लक्षित करने के लिए .vcxproj में स्विच करना है। हम पहले v90 का उपयोग कर रहे थे, या वीसी संकलक का उपयोग कर रहे थे जो वीएस 2008 एसपी 1 के साथ आया था।

ठीक है, तो परिवर्तन तोड़ रहे हैं? वास्तव में एक गुच्छा की तरह लगता है। मैंने सेट के साथ काम करने वाले कुछ इटरेटर मुद्दों को ठीक किया, जो सब कुछ बहुत आसान था।

लेकिन ये लिंकर त्रुटियां मुझे मार रही हैं। किसी भी मदद की सराहना की जाएगी:

1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0001c0). 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0001c5). 
... 

1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata inconsistent with COFF symbol table: symbol '[email protected]@[email protected]@[email protected]@@Z' (06000141) has inconsistent metadata with (0A000F75) in identity.obj 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata inconsistent with COFF symbol table: symbol '[email protected]@[email protected]@[email protected]@@Z' (06000141) has inconsistent metadata with (0A000F76) in ICustAttribCollapseManagerImp.obj 
... (repeated hundreds of times) 

मैं आगे चला गया और प्रतीक असज्जित:

[email protected]@[email protected]@[email protected]@@Z 

और मिल गया:

public: __thiscall std::allocator<char>::allocator<char>(class std::allocator<char> const &) 

तो, के रूप में मैं इसे समझ, msvcmrtd.lib फ़ाइल क्या यह std :: आवंटक एक तरह से संकलित है, और मेरी परियोजना सेटिंग्स में कुछ और (#pragma प्रबंधित ??) एक और अलग तरीके से संकलित है। लेकिन यदि हां, तो मैं क्या देखूं? यह पुराने कंपाइलर्स का उपयोग कर वर्षों से ठीक संकलित कर रहा है।

नोट: हम वर्तमान में 3.5 .NET फ़्रेमवर्क (सुनिश्चित नहीं हैं कि अगर मदद करता है या नहीं ... मैं इसे शक)

धन्यवाद

उत्तर

3

इस समस्या का निदान करने के लिए एक कठिन है, लिंकर त्रुटियों बदबू आ रही है और खराब दस्तावेज हैं। पृष्ठ के निचले भाग में this thread में इसके बारे में माइक्रोसॉफ्ट में एसटीएल रखरखाव स्टीफन लैववेज की एक पोस्ट है। मुझे कहना है कि मुझे आपकी प्रोजेक्ट सेटिंग्स (_HAS_ITERATOR_DEBUGGING = 0 प्रीप्रोसेसर निश्चित में) में इटरेटर डिबगिंग को अक्षम करने की कोशिश करने से परे इसमें कोई भी सलाह नहीं दिखाई दे रही है।

आपको कोड समीक्षा पर विचार करने की आवश्यकता है। यह निश्चित रूप से लगता है कि आप प्रबंधित कोड में एसटीएल कोड संकलित कर रहे हैं। यह सामान्य रूप से काम करता है (लिंकर परेशानी से कम) लेकिन यह वास्तव में गलत काम है। एसटीएल संग्रह कक्षाओं को अपने मूल कोड में छोड़ दें, अपने प्रबंधित कोड में बीसीएल संग्रह कक्षाओं (सूची <> आदि) का उपयोग करें।

+0

यह एक जानवर है। यहां तक ​​कि एमएसडीएन पर आपके द्वारा लिंक किए गए थ्रेड के पास बहुत कुछ नहीं था। मैं प्रीप्रोसेसर को एक कोशिश करने का सुझाव दूंगा, और कल आपको बताने के लिए, इस धागे पर वापस आऊंगा। –

+0

प्रीप्रोसेसर को स्थापित करने का प्रयास किया, कोई सफलता नहीं।यह सब बुरा लिखने वाले देव ने अब मेरी कंपनी के लिए काम नहीं किया है, और मुझे गड़बड़ी लेने के लिए छोड़ दिया गया है। आपकी मदद के लिए धन्यवाद। –

+1

मैं इसे उत्तर के रूप में चिह्नित करने जा रहा हूं, क्योंकि आपके द्वारा प्रदान किए गए लिंक में, श्री लैववेज ने नोट किया कि std :: string class अब केवल वीसी 10.0 में शीर्षलेख है और अधिकांश, यदि नहीं, तो मेरी लिंकर त्रुटियों के स्ट्रिंग से संबंधित हैं मुद्दे। हालांकि मेरे पास अभी तक इसका कोई संकल्प नहीं है। –

2

मेरे मामले में क्या करने के लिए .VCXPROJ में TargetFramework बदल रहा था मदद की है:

<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> 

लेकिन जैसा कि आप उल्लेख किया है आप 3.5 के खिलाफ संकलन करने की जरूरत है कि मैं क्या आपको लगता है कि मामले में क्या कर सकते हैं यकीन नहीं है।

0

मैंने हाल ही में वीएस -2008 प्रोजेक्ट को वीएस2012 में माइग्रेट किया जिसमें सी ++/क्ली प्रोजेक्ट शामिल था और इन त्रुटियों का अनुभव किया। जब मैं अपनी प्रोजेक्ट/बिल्ड फाइलों की बात करता हूं तो मैं बहुत गुदा प्रतिशोधपूर्ण हूं इसलिए मैंने कुछ कस्टम .props msbuild फाइलें सेट की हैं जो सभी परियोजनाएं आयात करती हैं (एमएसबिल्ड एक्सएमएल में सभी दोहराए गए और कंडीशन वाले तत्वों से बचने के लिए)।

तो प्रोजेक्ट का उदाहरण उदाहरण था। Vcxproj।

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 
<PropertyGroup Label="Configuration"> 
    <ConfigurationType>DynamicLibrary</ConfigurationType> 
    <PlatformToolset>v110_xp</PlatformToolset> 
    <CharacterSet>Unicode</CharacterSet> 
    <CLRSupport>true</CLRSupport> 
    <-- Including this here fixed my linker problems --> 
    <!--<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>--> 
</PropertyGroup> 
... 
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> 
... 
<Import Project="$(SolutionDir)..\shared\config\msbuild\FileWithCommonSettings.props" /> 

मैं अपने FileWithCommonSettings.props फ़ाइल था (है जहाँ मैं -TargetFrameworkVersion- परिभाषित) -after- Microsoft.Cpp.props शामिल किया जा रहा: और शुरू के निकट मैं इस किया था। मैंने इसके बजाय Cpp.props से पहले-TargetFrameworkVersion- को सेट करने का प्रयास करने का विकल्प चुना, जैसा कि आप एक्सएमएल टिप्पणी में देख सकते हैं। यह सब मुझे प्राप्त करने वाले सभी लिंकर मुद्दों को ठीक करना। मेरा अनुमान है कि VSP.Default.props VS2010 और बाद में v4.0 पर डिफ़ॉल्ट है।

आशा इस मदद करता है

संपादित: Refering to this social.msdn thread, यह जाहिर होता आप वास्तव में v3.5 लक्षित करने के लिए VS2010 (यानी, टूलसेट V100) का उपयोग करने की जरूरत है। मुझे एहसास नहीं हुआ कि मैं चुपचाप 4.0 को वीसी 110 के साथ लक्ष्य बना रहा था ... लेकिन यह केवल तब जोड़ा गया जब मैंने इसे जोड़ा-TargetFrameworkVersion- तत्व को लिंकर त्रुटियों से छुटकारा मिला। Vc100 टूलसेट पर स्विच करने के बाद लिंकर त्रुटियां वापस आईं।

0

हालांकि इस मुद्दे का मेरा समाधान यह नहीं बताता है कि ऐसा क्यों होता है, अगर मैं किसी और परिदृश्य में आता हूं तो मैं अपने अवलोकनों को देख रहा हूं।

मुझे भी मेरे क्लियर प्रोजेक्ट को संकलित करने में समान त्रुटियां मिलीं। मेरा लक्ष्य मेरा संस्करण 11.0 पर अपग्रेड करना था, लेकिन लक्ष्य के रूप में .NET Framework 2.0 को बनाए रखना था। मेरे मामले में, मैंने Lnk2034 और lnk2020 त्रुटियों को देखा (ऊपर उल्लिखित lnk2022 से अलग)।

1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata inconsistent with COFF symbol table: symbol '[email protected]@@[email protected]@@Z' (06000068) has inconsistent metadata with (0A000C23) in DirectSystemAccessProxy.obj 
1>LINK : error LNK2034: metadata inconsistent with COFF symbol table: symbol '[email protected][email protected]' (060003CB) has inconsistent metadata with (0A00009D) in MSVCMRTD.lib(locale0_implib.obj) 
... 
1>myProject.obj : error LNK2020: unresolved token (0A000C23) "void __cdecl std::_Facet_Register_m(class std::_Facet_base *)" ([email protected]@@[email protected]@@Z) 
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2020: unresolved token (0A0000C4) "extern "C" void __cdecl free(void *)" ([email protected]@[email protected]) 
... 

प्रारंभ में, मैं इस परियोजना में देशी कंटेनर के उपयोग को सही करके हंस पासत की सलाह का पालन कर रहा था। मैंने उन कंटेनरों के सभी उदाहरणों को यह सत्यापित करने के लिए टिप्पणी की कि वे वास्तव में विफलता का कारण थे।

जांच के दौरान मुझे पता चला कि निम्न पंक्ति मेरी त्रुटि के कारण:

std::wstringstream wstream; 
wstream << " Failed to to do something \'" << var << "\'."; 

पल मैं निम्नलिखित करने के लिए यह सही है, उन त्रुटियों को दूर चला गया।

std::wstringstream wstream; 
wstream << L" Failed to to do something \'" << var << L"\'."; // Added wide string literal. 

कोई विचार नहीं कि इस तरह की रेखा इस व्यवहार का कारण बनती है, लेकिन ऐसा हुआ।

साइड नोट:

  • एक उच्च .NET फ्रेमवर्क (4.0) लक्ष्य निर्धारण भी काम किया है, लेकिन मैं 2.0 के मूल .NET फ़्रेमवर्क लक्षित करने के लिए छड़ी करना चाहता था।
  • मेरे परियोजना preprecossor परिभाषा नहीं था: _HAS_ITERATOR_DEBUGGING = 0. मेरी समझ के लिए,/CLR में _HAS_ITERATOR_DEBUGGING संकलन अब समर्थित नहीं है (हंस पसाट के जवाब में लिंक देखें)
0

मेरे जैसे किसी के लिए भी है कि इस सवाल का जवाब । रिंग उपयोगी नहीं था, एक दूसरा विकल्प पर जाने के लिए है: परियोजना गुण> विन्यास गुण> जनरल> परियोजना चूक -> नेट लक्ष्य फ्रेमवर्क संस्करण और v4.0 के लिए सेट

https://connect.microsoft.com/VisualStudio/feedbackdetail/view/806238/unwarranted-linker-errors-using-stl-filestream-class-in-managed-classes-in-c-11-cli एमआई से एक अस्पष्ट जवाब है क्रॉसॉफ्ट टीम ने मेरी समस्या तय की।

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