MinGW

2010-03-18 11 views
27

से एमएसवीसी डीएलएल से लिंक करना मैं अपने स्वयं के एप्लिकेशन में LizardTech GeoExpress DSDK को लिंक करने का प्रयास कर रहा हूं। मैं जीसीसी का उपयोग करता हूं ताकि हम प्लेटफार्मों के लिए संकलित कर सकें। लिनक्स और मैक पर यह आसानी से काम करता है: वे एक स्थिर पुस्तकालय (libltidsdk.a) और शीर्षलेख प्रदान करते हैं और हमें जो कुछ करना है, उनका उपयोग करना है।MinGW

विंडोज़ के लिए संकलन इतना आसान नहीं है। उन्होंने माइक्रोसॉफ्ट विजुअल स्टूडियो का उपयोग करके लाइब्रेरी बनाई है, और हम मिनजीडब्ल्यू का उपयोग करते हैं। मैंने मिनजीडब्ल्यू एफएक्यू पढ़ा है, और मैं नीचे दी गई समस्याओं में भाग रहा हूं। लाइब्रेरी सभी सी ++ है, इसलिए मेरा पहला सवाल: क्या यह भी संभव है?

बस डीएल के खिलाफ लिंकिंग के रूप में सभी सी ++ कॉल (रचनाकार, desctructors, विधियों, आदि) के लिए उपज "अनिर्धारित संदर्भ" त्रुटियों के रूप में लिंक।

MinGW विकी के आधार पर: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs मैं उपयोगिता reimp उपयोग करने के लिए कुछ उपयोगी में एक उदारीकरण कन्वर्ट करने के लिए सक्षम होना चाहिए। मैंने LizardTech द्वारा प्रदान की गई सभी .lib फ़ाइलों को आजमाया है, और वे सभी "अमान्य या दूषित आयात लाइब्रेरी" देते हैं। मैंने रींप उपयोगिता के संस्करण 0.4 और 0.3 दोनों की कोशिश की है।

विकी में वर्णित दूसरी विधि का उपयोग करके, मैंने एक .a संग्रह प्राप्त करने के लिए dll पर pexport और dlltool चलाया है, लेकिन यह वही अपरिभाषित संदर्भ उत्पन्न करता है।

बीटीडब्लू: मैंने नीचे चर्चा पढ़ी है। यह कुछ अस्पष्टता छोड़ देता है कि यह संभव है या नहीं, और मिनजीडब्ल्यू विकी पेज दिया गया ऐसा लगता है कि ऐसा करने योग्य होना चाहिए। यदि यह असंभव है, तो मुझे बस इतना ही पता होना चाहिए। यदि यह किया जा सकता है, तो मैं जानना चाहता हूं कि मैं इसे कैसे प्राप्त कर सकता हूं।

How to link to VS2008 generated .libs from g++

धन्यवाद!

उत्तर

22

आप यह नहीं कर सकते हैं। उन्होंने सी-फंक्शंस के बजाए सी ++ कक्षाओं को अपने डीएल से निर्यात किया है। अंतर यह है कि, C++ फ़ंक्शंस हमेशा एक उलझन वाले रूप में नामों के साथ निर्यात किए जाते हैं जो संकलक के किसी विशेष संस्करण के लिए विशिष्ट होते हैं।

उनके dll केवल उस रूप में MSVC द्वारा प्रयोग करने योग्य है, और शायद भी, MSVC के विभिन्न संस्करणों के बीच काम नहीं करेगा के रूप में माइक्रोसॉफ्ट से पहले उनके mangling योजना बदल गया है।

आप किसी भी लाभ उठाने है, तो आप उन्हें अपने बुराई तरीके को बदलने के लिए प्राप्त करने की जरूरत है। अन्यथा आपको एक शिम डीएल लिखने के लिए एमएसवीसी का उपयोग करने की आवश्यकता होगी, जो सभी वर्गों को आयात करेगा, और इंटरफेस लौटने वाले सी कार्यों के माध्यम से उन्हें फिर से निर्यात करेगा।

+1

धन्यवाद, यह वही पुष्टि है जिसे मैं ढूंढ रहा था। उनके पास एक सी इंटरफ़ेस है, और मैं इसका उपयोग कर रहा हूं, लेकिन यह C++ में उपलब्ध चीज़ों की तुलना में बहुत कम शक्तिशाली है। मैं उन्हें मिनीजीडब्ल्यू के लिए रिहा करने के लिए भी दबाव डाल रहा हूं। – IndigoFire

+5

मैं दृश्य स्टूडियो संस्करण विशिष्ट रनटाइम msvcr70.dll, msvcr71.dll, msvcr80 के बजाय सी-रनटाइम निर्भरता सार्वभौमिक रूप से उपलब्ध msvcrt.dll है, क्योंकि यह तैनाती वास्तव में सरल बनाता है, क्योंकि यह सब कुछ तैनाती को आसान बनाता है। डीएलएल, msvcr90.dll और अब msvcr100.dll। –

3

मैं लगभग निश्चित करता हूं कि आप इस तरह के कंपाइलरों में सी ++ पुस्तकालयों को लिंक नहीं कर सकते हैं। मैंने कोशिश की है, वास्तव में कड़ी मेहनत की है, लेकिन यह बहुत समय पहले था और मुझे विवरण याद नहीं है। मुझे लगता है कि सी पुस्तकालयों के लिए बहुत सारे हैक के साथ संभव है।

0

विंडोज में एक डीएलएल का उपयोग करने के लिए, आप एक आयात पुस्तकालय (डीएलएल स्वयं नहीं) के खिलाफ लिंक करते हैं। आयात पुस्तकालयों में आम तौर पर एक्सटेंशन होता है। Lib (स्थिर पुस्तकालयों की तरह)। यदि आप विंडोज एसडीके डाउनलोड करते हैं, तो आपको सिस्टम सिस्टम डीएलएल के लिए आयात पुस्तकालय मिलेंगे।

आपके प्रश्न से, ऐसा लगता है कि आप .lll के साथ .dll को मिश्रित कर सकते हैं। क्या आप निश्चित रूप से इनपुट के रूप में डीएलएल नहीं लेते हैं और एक .LIB आयात लाइब्रेरी बनाते हैं जो MinGW के साथ संगत है?

मैंने अभी देखा है कि मिनीजीडब्ल्यू विकिपीडिया पर है। उस लेख के अनुसार, मिनजीडब्ल्यू पुनर्वितरण योग्य आयात पुस्तकालयों के साथ आता है।

+1

मिनजीडब्ल्यू विकी के आधार पर, रींप एक आयात पुस्तकालय लेता है। डीएलएल के खिलाफ इसे चलाने से काम नहीं होता है, हालांकि मैंने कोशिश की थी। – IndigoFire

6

http://www.mingw.org/wiki/DLL आपके लिए उपयोगी हो सकता है।

+0

+1 क्योंकि तथ्य के बावजूद उत्तर एक नहीं चुना गया है, इसने मेरी समस्या हल कर दी है। – Claudix