2010-11-27 14 views
5

मैं लिनक्स से mingw और crosscompilation का उपयोग कर Win32 के लिए प्लग-इन विकसित कर रहा हूं। यद्यपि मेरी प्लगइन सफलतापूर्वक एप्लिकेशन द्वारा लोड की गई है और मुझे ऐप से कॉम-इंटरफ़ेस भी मिला है, मैं वहां से फ़ंक्शंस कॉल नहीं कर सकता - ऐप क्रैश हो गया है। मुझे लगता है कि यह mingw में इंटरफेस कार्यान्वयन के गलत vtable संरेखण के कारण है (यह पूरी तरह से एमएसवीएस के साथ काम किया)।आभासी कार्यों के लिए संरेखण कैसे सेट करें?

किसी भी मदद की सराहना की जाएगी, धन्यवाद।

उत्तर

4

वीटीबल संरेखण (वास्तव में, पूरी VTable प्रणाली बिल्कुल) पूरी तरह कार्यान्वयन निर्भर है। लिंकेज के बाद एक व्यावहारिक प्रोग्राम करने के लिए, आपको उसी स्विच/सेटिंग्स के साथ संकलित एक ही कंपाइलर का उपयोग करना होगा।

आप इस कारण से MinGW जेनरेट किए गए लोगों के खिलाफ एमएसवीसी जेनरेट की गई बाइनरी को लिंक नहीं कर सकते हैं। यहां तक ​​कि यदि आपको सारणी को संरेखित करने के लिए टेबल मिलते हैं, तो नाम मैंगलिंग एल्गोरिदम अलग हैं, और कोई भी नहीं कहता है कि दो कंपाइलर स्वयं को VTE ​​के भीतर व्यक्तिगत कार्यों के लिए एक ही क्रम चुनते हैं।

यदि आपको दो कंपाइलरों के बीच एक पोर्टेबल इंटरफ़ेस की आवश्यकता है, तो आपको इसे सी (तकनीकी रूप से extern "C") इंटरफ़ेस के साथ करना होगा, जिसमें एक मानक एबीआई है।

+1

COM भी एबीआई है, लेकिन हो सकता है कि मिनीगब्लूडब्ल्यू इतनी आसानी से समर्थन न करे। :) (COM (बिल्कुल सही नहीं है) पर आधारित है कि किसी दिए गए प्लेटफॉर्म पर सभी सी ++ कंपाइलर्स एक ही vtable संरचना और लेआउट का उपयोग करेंगे। मुझे आश्चर्य है कि MinGW इसे इतना कठिन बनाता है क्योंकि COM Win32 का एक प्रमुख हिस्सा है अन्य सी ++ कंपाइलर्स COM ठीक समर्थन करते हैं, हालांकि, आपको सी या एक ही कंपाइलर का उपयोग करने की आवश्यकता नहीं है; विंडोज के लिए सिर्फ एक सभ्य सी ++ कंपाइलर।) बेशक, आप सीधे सी में COM भी कर सकते हैं (कोड द्वारा उत्पन्न कोड आईडीएल कंपाइलर आम तौर पर एक सी इंटरफ़ेस भी परिभाषित करता है) यदि यह आसान है। –

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