2008-09-20 14 views
8

के साथ एक डीएल संकलित करते समय जब हम विजुअल स्टूडियो 2008 के अंदर __stdcall का उपयोग करके एक डीएल संकलित करते हैं तो डीएलएल के अंदर संकलित फ़ंक्शन नाम होते हैं।जीसीसी __stdcall

functionName

हालांकि जब हम एक ही dll संकलन paramers कार्य है की संख्या wx-देव-सीपीपी जीसीसी का उपयोग कर संलग्न कर देता है जीसीसी का उपयोग कर, इसलिए निर्भरता वॉकर का उपयोग कर समारोह के नाम की तरह दिखता है।

functionName @ numberOfParameters या == functionName @ 8

कैसे आप जीसीसी संकलक बताऊँ dll में निर्यात प्रतीकों से @nn दूर करने के लिए?

उत्तर

5

__stdcall प्रारंभ में अंडरस्कोर जोड़कर फ़ंक्शन नाम को सजाने के लिए, और अंतराल के बाइट्स की संख्या अंत तक (@ द्वारा अलग) को सजाने के लिए सजाता है।

तो, एक समारोह:

void __stdcall Foo(int a, int b); 

... @ 8 _Foo बन जाएगा।

यदि आप अपनी .DEF फ़ाइल के निर्यात अनुभाग में फ़ंक्शन नाम (अवांछित) सूचीबद्ध करते हैं, तो इसे अपरिवर्तित निर्यात किया जाता है।

शायद यह अंतर है?

+0

उत्तर के लिए धन्यवाद roger, यह पता चला कि समस्या यह थी कि एक और डेवलपर ने परियोजना में एक डीईएफ फ़ाइल रखा। इस डीईएफ फ़ाइल ने लिंकर को नामकरण सम्मेलनों को डीएलएल के अंदर उपयोग करने के लिए कहा। यही कारण है कि हम एक ही कॉलिंग सम्मेलन के साथ भी एक अलग पुस्तकालय नाम प्राप्त कर रहे थे। समाधान यह पता चला कि हमारे डेवलपर्स में से एक ने प्रोजेक्ट के लिए अपना स्वयं का डीएलएल बनाते समय हेन फ़ाइल से WINAPI को हटा दिया था। इसने विंडोज विजुअल स्टूडियो को __cdecl (/ gd) के अपने डिफ़ॉल्ट कॉलिंग सम्मेलन में वापस लाने के लिए प्रेरित किया। – Chad

6

जीसीसी कमांड लाइन पर बस -Wl,--kill-at का उपयोग करें, जो लिंकर को --kill-at पास करेगा।

संदर्भ:

+1

मैं पुष्टि कर सकता हूं कि - mingw-w64 टूलचेन्स के साथ काम करता है। – Sven

0

तुम भी जीसीसी में अपने लिंकर विकल्प के लिए -Wl,--add-stdcall-alias उपयोग कर सकते हैं। यह सुनिश्चित करेगा कि दोनों फ़ंक्शन नाम (सजाए गए और निर्विवाद) मौजूद हैं और उपनाम के रूप में उपयोग किए जा सकते हैं।

+0

धन्यवाद मैथियस यह नहीं जानता था। – Chad