visual c++ _imp और__imp में क्या अंतर है?



visual-c++ dll (1)

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

ऐसा होने वाली अगली बात यह है कि कंपाइलर पहचानकर्ता को सजाने के लिए लिंकर को गलत मैचों में पकड़ने की अनुमति देता है। बहुत महत्वपूर्ण है क्योंकि संकलक मॉड्यूल में घोषणा बेमेल के निदान नहीं कर सकता है और रनटाइम पर उन्हें स्वयं का निदान बहुत दर्दनाक है।

पहले सी ++ सजावट, एक बहुत ही शामिल योजना है जो फ़ंक्शन ओवरलोड का समर्थन करती है। यह बहुत विचित्र लग रही नामों को उत्पन्न करता है, आमतौर पर बहुत सारे सहित? और तर्क के लिए अतिरिक्त वर्णों के साथ @ वर्ण और वापसी के प्रकार ताकि ओवरलोड अनिवार्य हो। फिर सी पहचानकर्ता के लिए सजावट है, वे कॉलिंग सम्मेलन पर आधारित हैं। एक cdecl फ़ंक्शन के पास एक अग्रणी अंडरस्कोर है, एक stdcall फ़ंक्शन का एक प्रमुख अंडरस्कोर होता है और एक अनुगामी @ n होता है जो स्टैक को असंतुलन करने से पहले तर्क घोषणा बेमेल के निदान की अनुमति देता है। सी सजावट 64-बिट कोड में अनुपस्थित है, वहाँ (आशीर्वाद) केवल एक कॉलिंग सम्मेलन है

तो आपको लिंकर त्रुटि मिली क्योंकि आप सी लिंकेज निर्दिष्ट करना भूल गए थे, लिंकर को हल्के ढंग से सजाया सी नाम के साथ भारी सजाए गए C ++ नाम से मिलान करने के लिए कहा गया था। इसके बाद आप इसे extern "C" साथ तय किया extern "C" , अब आपको _imp_ लिए एकल जोड़ा _imp_ मिला है, _imp_ में __imp_

मुझे एक दिलचस्प त्रुटि मिली जब मैं क्यूटी क्रिएटर में काम करते समय एक एमएसवीसी-संकलित लाइब्रेरी से मिनग्यूड का इस्तेमाल करने की कोशिश कर रहा था। लिंकर ने एक लापता प्रतीक की शिकायत की जो कि _imp_FunctionName तरह चला गया। जब मुझे एहसास हुआ कि यह एक लापता extern "सी" के कारण था, और इसे तय किया, मैं भी / एफएसीएस के साथ एमएसवीसी कंपाइलर दौड़ा क्या देखने के लिए प्रतीकों क्या है निकलता है, यह __imp_FunctionName था (जो कि जिस तरह से मैंने एमएसडीएन पर पढ़ा था और कुछ गुरू ब्लॉगर्स 'साइट्स) थे।

मैं पूरी तरह से उलझन में हूं कि कैसे _imp लिंकर एक प्रतीक के बारे में शिकायत करता है जो कि _imp साथ शुरू होता है, लेकिन यह अच्छी तरह से खोजने में सक्षम है, हालांकि यह __imp शुरू होता है। क्या एक गहरी संकलक जादूगर इस पर कुछ प्रकाश डाल सकता है? मैंने विज़ुअल स्टूडियो 2010 का इस्तेमाल किया





mingw