अगर मैं इस तरह एक समारोह की घोषणा:डीएलएल नाम सजावट के बिना __stdcall का उपयोग कर: यह भी क्यों काम करता है?
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
TESTAPI int __stdcall myadd(int a, int b);
DLL में प्रतीक [email protected]
, जो मेरे लिए एकदम सही समझ में आता है (यहाँ अन्य प्रश्न पढ़ने के कुछ घंटों के बाद, वह है) है।
लेकिन विंडोज पुस्तकालय कुछ अलग करने लगते हैं। वे __stdcall
(WINAPI
के रूप में छिपे हुए) का भी उपयोग करते हैं, लेकिन डीएलएल में प्रतीकों का कोई नाम सजावट नहीं है। यदि विंडोज़ libs में ऊपर की विधि, प्रतीक myadd
होगा।
मेरा अनुमान है कि वे प्रतीकों के उपनाम के लिए एक डीफ़ फ़ाइल का उपयोग करते हैं। लेकिन जब मैं इन डीएलएल में से किसी एक से लिंक करता हूं तो मेरे लिंकर को यह क्यों पता है?
विंडोज हेडर फाइलें इन कार्यों को WINAPI
के साथ घोषित करती हैं, इसलिए यदि मैं उन्हें कॉल करता हूं, तो लिंकर को सजाए गए नाम की तलाश करनी चाहिए, क्योंकि यह __stdcall
फ़ंक्शन है। फिर भी किसी भी तरह से लिंकर नाम सजावट छोड़ना जानता है।
मैंने इसे एक छोटा डीएलएल लिखकर और डीफ़ फाइल के साथ नाम सजावट को हटाकर इसे दोहराने की कोशिश की है। जैसा कि अपेक्षित है मुझे लिंकर त्रुटियां मिलती हैं क्योंकि लिंकर अभी भी सजाए गए नाम की तलाश में है। मैंने यह सुनिश्चित करने के लिए शुद्ध सी में किया है कि C++ नाम मैंगलिंग इसे प्रभावित नहीं करता है।
संपादित करें: स्पष्ट करने के लिए, MSVC 14.0/VS2015, 32-बिट
ध्यान दें कि x64 नाम सजावट का उपयोग नहीं करता है। –
@ जोनाथनपोटर: * "ध्यान दें कि x64 नाम सजावट का उपयोग नहीं करता है।" * - यह केवल 'बाहरी' सी '' के लिए सच है। सी ++ प्रतीकों में ओवरलोड रिज़ॉल्यूशन के लिए निर्यात नामों को सजाया जाना चाहिए। – IInspectable