2012-11-14 15 views
5

मैं जो निम्न पंक्ति64 बिट नाम C++

#pragma comment(linker, "/include:[email protected]") 

परियोजना जो इस कोड का उपयोग करता है ठीक काम करता है जब मैं विन्यास प्रकार 32 बिट के साथ सी ++ विजुअल स्टूडियो 2010 का उपयोग कर कोड संकलन (मैं है कोड का एक सा है के लिए mangling 32 बिट विंडोज़ मशीन पर भी हूं)।

मैं 32bit 64 बिट बनाम के लिए अलग mangling सी ++ नाम है जब मैं 64 बिट करने के लिए मशीन को बदलने और 64 विन्यास जो सी ++ विजुअल स्टूडियो 2010

साथ संकलन का उपयोग एक लिंक त्रुटि मिलती है? यदि हां, तो मुझे 64 बिट सी ++ नाम मैंगलिंग सम्मेलन कहां मिल सकता है?

उत्तर

7

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

सरल नमूना: void foo();

32bit: [email protected]@@QAEXXZ 
64bit: [email protected]@@QEAAXXZ 

गैर घायल एसटीडी कॉल के लिए, लंबाई प्रत्यय, काफी अलग हो सकता है पैरामीटर ढेर उपयोग के आधार पर। वीसी ++ के लिए डिफ़ॉल्ट 64-बिट सेटिंग्स अंडरस्कोर प्रीपेड नहीं करती हैं और न ही यह लंबाई-प्रत्यय को एन्कोड करता है। निम्नलिखित शुद्ध आउट-ऑफ-द-बॉक्स सेटिंग्स के साथ दोनों 32/64 बिट कॉन्फ़िगरेशन संकलित किया गया था:

extern "C" int _stdcall func2(int, int, char*); 

32bit: [email protected] 
64bit: func2 

ज्यादा वहाँ बिंदु, वहाँ है।

सर्किट पूर्ण कर रहा है, unmangled _cdecl, जो करता है यह:

extern "C" int _cdecl func2(int, int, char*); 

32bit: _func2 
64bit: func2 

तो ऐसा लगता है जैसे वे तुम्हें पता है कि तुम क्या खींच-इन कर रहे हैं या करने के लिए निर्यात बाहर अपने रास्ते से हट गया था, सबूत से पता चलता आप शायद सही हैं।

+0

यह वास्तव में काफी अलग हो सकता है ... यदि 'टेस्ट' को तीन पॉइंटर पैरामीटर प्राप्त होते हैं तो यह '12' से' 24' तक बदल जाएगा ... आह, यह भी एक C++ फ़ंक्शन नहीं है। ऐसा लगता है कि एक 'stdcall' सी समारोह है। – ybungalobill

+0

मैं इसके बारे में कहां से सीख सकता हूं। मैं इन अवधारणाओं में नया हूं। मुझे भी लगता है कि मेरा एक स्टडकॉल है और आपने जो उदाहरण दिया है वह सीडीसीएल के लिए है। मेरे पास #pragma टिप्पणी (लिंकर, "/ निर्यात: परीक्षण @ 0 = परीक्षण" जैसी कुछ अन्य कॉल हैं) मुझे उन्हें कैसे बदलना चाहिए। इनको स्पष्ट करने वाला एक संदर्भ महान होगा। – user1612986

+0

सी ++ नाम मैंगलिंग पर कई दस्तावेज हैं (मैंने आपको उनमें से एक जोड़ा है)। आप अपने निर्यात के लिए बाहरी "सी" _stdcall का उपयोग कर रहे हैं, जो ऊपर दिखाए गए अनुसार 32.vs.64-bit में भिन्न हैं। एमएस और विकी में सचमुच लेख हैं। हालांकि वीबी से संबंधित, मुझे [यह पोस्ट] पसंद है (http://msdn.microsoft.com/en-us/library/dt232c9t (v = vs.71) .aspx) क्योंकि यह इसके बारे में बात करने का एक अच्छा काम करता है। एक तरफ या दूसरा, हालांकि, आपको अपने #pragmas को #ifdef WIN64 पर साफ़ करना होगा और या तो उपयुक्त नाम आयात या निर्यात करना होगा, मुझे डर है। – WhozCraig