2009-04-20 10 views
8

मैं लिनक्स (जीसीसी) से विंडोज (विजुअल सी ++ 2008) में एक बड़े सी ++ एप्लिकेशन को पोर्ट करने की प्रक्रिया में हूं और प्लगइन के साथ लिंकर समस्याएं हैं। लिनक्स पर यह कोई मुद्दा नहीं था, क्योंकि। रनटाइम प्रतीक लुकअप का समर्थन करता है, लेकिन डीएलएल इसका समर्थन नहीं करता है।विजुअल सी ++ - एक्सईई के खिलाफ प्लगइन डीएलएल लिंकिंग?

कुछ पृष्ठभूमि जानकारी: एप्लिकेशन (मेजबान), जो एक स्क्रिप्टिंग वातावरण होस्ट करता है, प्लगइन्स (साझा लाइब्रेरी जो स्क्रिप्ट एपीआई कॉल द्वारा रनटाइम पर लोड होते हैं) को इंटरफेस प्रदान करता है, जिससे मेजबान और स्क्रिप्टिंग एपीआई को विस्तारित किया जा सकता है मेजबान आवेदन recompiling बिना। लिनक्स पर यह प्लगइन स्रोत में होस्ट एप्लिकेशन के शीर्षलेखों को शामिल करने का मामला है, लेकिन विंडोज़ पर मुझे लिंकर त्रुटियां मिल रही हैं। मुझे यकीन नहीं है कि इन प्रतीकों को हल करने के लिए मुझे Visual C++ के साथ लिंक करने की आवश्यकता है।

हमारे निर्भरता (खुला स्रोत, LGPL) में से एक पूर्वप्रक्रमक घोषणाओं है कि यह यह हेडर में (dllexport) और __declspec (dllimport) __declspec सम्मिलित करने के लिए उपयोग करता है। कुछ पूर्व शोध इंगित करते हैं कि मुझे यह भी करना पड़ सकता है, लेकिन मैं कोर हेडर के पूरे समूह को संशोधित करने से पहले यह सुनिश्चित करना चाहता हूं। (मैं पहले यह मिनीजीडब्ल्यू पर काम करने में सक्षम था, लेकिन हमने फैसला किया है कि विजुअल स्टूडियो का समर्थन इस प्रकार की वाणिज्यिक परियोजना के लिए एक आवश्यकता है।)

मेरा प्रश्न, संक्षेप में: मैं रनटाइम- विजुअल सी ++ में होस्ट एक्सई के खिलाफ लोड डीएलएस?

संपादित करें: एक उदाहरण के साथ समस्या यह स्पष्ट करने के लिए, मैं अपने मेजबान आवेदन में एक वर्ग है, वस्तु है, जो एक उद्देश्य यह है कि एक स्क्रिप्ट द्वारा पहुँचा जा सकता के आधार प्रकार का प्रतिनिधित्व करता है। मेरे प्लगइन में मेरे पास कई वर्ग हैं जो ऑब्जेक्ट को अन्य कार्यों को निष्पादित करने के लिए बढ़ाते हैं, जैसे नेटवर्किंग समर्थन या नए दृश्य तत्वों को एकीकृत करना। इसका मतलब है कि मेरे डीएल को मेजबान exe में प्रतीकों के साथ लिंक करना होगा, और मुझे यकीन नहीं है कि यह कैसे करें।

+0

मुझे इसके चारों ओर अपने सिर को लपेटने में कुछ परेशानी हो रही है। यदि आपके पास ठोस उदाहरण है और कोड की कुछ पंक्तियों को सरल बना सकता है जो शायद आपकी मदद करने में मदद कर सकता है। – ojblass

उत्तर

5

"रनटाइम प्रतीक लुकअप" से आपका क्या मतलब है? क्या आपका मतलब dlopen और dlsym और so on का उपयोग करके गतिशील रूप से पुस्तकालयों को लोड करना है? equivalents in Windows को LoadLibrary और GetProcAddress कहा जाता है।

विंडोज़ में, आप निष्पादन योग्य से प्रतीकों का निर्यात नहीं करते हैं। आपको केवल उन्हें एक डीएलएल से निर्यात करना चाहिए। आपकी समस्या को हल करने का सही तरीका पुनर्चक्रण करना है ताकि निर्यात किए गए प्रतीक एक डीएल में हों जो निष्पादन योग्य और अन्य प्लगइन डीएलएस के खिलाफ लिंक कर सकें।

+0

यह वही है, और मैं यह ठीक करने में सक्षम हूं, लेकिन मैं यह नहीं समझ सकता कि मेरे मेजबान निष्पादन योग्य (मेरे हालिया संपादन देखें) में परिभाषित प्रतीकों के खिलाफ उस डीएल को कैसे संकलित करें, –

+4

आप एक EXE से प्रतीक निर्यात कर सकते हैं; उन्हें लेने के लिए बस GetProcAddress (GetModuleHandle (NULL), "MyProc)) का उपयोग करें। –

+1

... लेकिन विंडोज लोडर स्वचालित रूप से आपके लिए यह नहीं करेगा। –

1

आप आसानी से नहीं कर सकते हैं। विंडोज लोडर को EXE से प्रतीकों को निर्यात करने के लिए डिज़ाइन नहीं किया गया है और उन्हें डीएलएल में प्रतीकों से बांधना है।

मैंने जो पैटर्न देखा है वह है डीएलएल निर्यात एक निश्चित कार्य है जिसे EXE कॉल करता है। यह पैरामीटर के रूप में एक संरचना के रूप में लेता है जिसमें कॉल करने के लिए डीएलएल के लिए EXE में फ़ंक्शंस के पते होते हैं।

1

1800 जानकारी के अनुसार, ऐसा मत करो। ऑब्जेक्ट को निष्पादन योग्य और "तीसरे" डीएलएल में ले जाएं। प्लगइन्स को लिंक करें और उसके खिलाफ निष्पादन योग्य।

1

मैं इसे लागू कर रहा हूं, लिनक्स और विंडोज दोनों के निर्माण के लिए प्लगइन लाइब्रेरी का निर्माण कर रहा हूं।

लिनक्स के तहत समाधान जीसीसी कमांड लाइन में-गतिशील विकल्प का उपयोग करना है। यह मुख्य निष्पादन योग्य में सभी प्रतीकों का निर्यात करता है, ताकि एक प्लगइन उन्हें लोड होने पर ढूंढ सके।

विंडोज के तहत, समाधान उन कार्यों की परिभाषा के सामने __declspec (dllexport) जोड़ने के लिए है जिसे आप डीएलएस का उपयोग करना चाहते हैं।संकलन डीएलएस के लिए लिंक करने के लिए एक .lib फ़ाइल बनाएगा। निश्चित रूप से विजुअल स्टूडियो 2008 के तहत काम करता है। संबंधित पोस्ट: https://stackoverflow.com/a/3756083/1486836

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