2011-12-30 12 views
17

के बीच * .dll * .a * .lib * .def की संगतता यह बहुत भ्रमित है। मैंने इस पर स्टैक, आदि पर पोस्ट पढ़ने में बहुत समय बिताया। फिर भी उलझन में।विजुअलस्टूडियो और जीसीसी

मैं कोडिंग के लिए क्यूटी और सी ++ का उपयोग कर रहा हूं। क्यूटी में, मैं एक कंपाइलर के लिए जीसीसी विकल्प का उपयोग कर रहा हूँ।
समस्या यह है कि मैंने कोशिश की है कि कई तृतीय पक्ष पुस्तकालयों काम नहीं कर रहे हैं।

मैं .dll, .a, .lib, .def फ़ाइलों और लाइब्रेरी योजनाओं में नया हूं।

प्रश्न 1:

अपने सीमित अनुभव में (मैं 7 या 9 पुस्तकालयों अब तक की कोशिश की है), पुस्तकालयों के आपूर्तिकर्ताओं शायद ही कभी यह बताती हैं कि .dll VisualStudio या जीसीसी के साथ बनाया गया था। यह बहुत भ्रम जोड़ता है। वे लगभग यह स्पष्ट नहीं करते कि लाइब्रेरी किस संकलक के साथ संगत है। तो मैं इस दुःस्वप्न से निपटने के तरीके के बारे में कुछ वास्तविक जीवन युक्तियों की सराहना करता हूं। मैंने कोशिश की लगभग सभी पुस्तकालय ओपनसोर्स परियोजनाएं हैं। मैं यहां नामों का नाम नहीं रखूंगा, लेकिन ये अच्छी तरह से ज्ञात परियोजनाएं हैं। मुझे यकीन है कि समस्या ज्ञान की मेरी कमी है हूँ ...

MinGW और जीसीसी विश्व

Question2:
जहां तक ​​मेरा बता सकते हैं, गतिशील सी ++ MinGW जीसीसी ब्रह्मांड के लिए पुस्तकालयों इन, है ना की आवश्यकता होती है ?
* ज
* .dll
* .a

प्रश्न 3:
दुर्भाग्य से, .a फ़ाइल अक्सर याद आ रही है और पुस्तकालय काम नहीं करता। यह बहुत भ्रमित है। अगर .a फ़ाइल गुम हो गई है तो क्या मैं भाग्य से बाहर हूं?

प्रश्न 4:
क्या मैं *। डीएल जीसीसी के साथ बनाया गया था, तो मैं मिनीजीडब्ल्यू/जीसीसी के लिए .a फ़ाइल उत्पन्न कर सकता हूं?

प्रश्न 5: यदि मैं VisualStudio के साथ * .dll बनाया गया था, तो क्या मैं MinGW/gcc के लिए .a फ़ाइल उत्पन्न कर सकता हूं?

प्रश्न 6:
क्या यह संभव है कि * .dll (MinGW/gcc के साथ बनाया गया) बहुत पुराना है और अब नए MinGW/gcc के साथ संगत नहीं है?

प्रश्न 7:
मिनजीडब्ल्यू/जीसीसी का उपयोग कर क्यूटी परियोजनाओं को * .lib फ़ाइलों की आवश्यकता नहीं है, है ना? यह केवल एक दृश्य स्टूडियो है, है ना?

प्रश्न 8:
मुझे मिनीजीडब्ल्यू/जीसीसी का उपयोग करके एक क्यूटी परियोजनाओं में * .dll का उपयोग करने के लिए * .def फ़ाइल की आवश्यकता नहीं है, है ना?

VisualStudio विश्व

प्रश्न 9:
* ज
* .dll
* उदारीकरण

:
जहां तक ​​मेरा बता सकते हैं, गतिशील सी ++ VisualStudio के लिए पुस्तकालयों इन की आवश्यकता होती है

सही? फिर, समस्या यह है कि * .lib फ़ाइल लगभग हमेशा गायब है। इसके अलावा, पुस्तकालय के साथ संगत संकलक के बारे में कोई स्पष्ट निर्देश नहीं है। तो मैं कैसे जान सकता हूं कि यह केवल VisualStudio के लिए है या नहीं?

प्रश्न 10:
यदि .lib फ़ाइल गुम है तो क्या मैं भाग्य से बाहर हूं?

प्रश्न 11:
क्या मैं VisualStudio के लिए .lib फ़ाइल उत्पन्न कर सकता हूं यदि * .dll VisualStudio के साथ बनाया गया था? कैसे?

प्रश्न 12:
क्या मैं VisualStudio के लिए .lib फ़ाइल उत्पन्न कर सकता हूं यदि * .dll MinGW/gcc के साथ बनाया गया था? कैसे?

प्रश्न 13:
क्या यह संभव है कि * .dll (VisualStudio के साथ बनाया गया) बहुत पुराना है और अब नए VisualStudio के साथ संगत नहीं है?

प्रश्न 14:
यदि QtCreator में मैं विजुअलस्टूडियो कंपाइलर का चयन करता हूं, तो क्या 100% वास्तविक VisualStudio के साथ संकलित गतिशील पुस्तकालयों के साथ संगत है? मेरा मानना ​​है कि क्यूटी निर्माता में विजुअलस्टूडियो कंपाइलर विकल्प एक नकली विजुअल स्टूडियो कंपाइलर है।

प्रश्न 15:
QtCreator में मैं MinGW/जीसीसी संकलक का चयन करते हैं, मैं क्यूटी गतिशील किसी और के द्वारा असली VisualStudio साथ संकलित पुस्तकालयों के साथ उपयोग कर सकते हैं?

प्रश्न 16:
मुझे मिनीजीडब्ल्यू/जीसीसी का उपयोग करके एक क्यूटी परियोजनाओं में * .dll का उपयोग करने के लिए * .def फ़ाइल की आवश्यकता नहीं है, है ना?

प्रश्न 17: क्या मैं एक * lib (जो * * .dll और * .h) के साथ काम करता है, जो एक * .a फ़ाइल में वास्तविक VisualStudio के साथ बनाई गई है, इसलिए मैं * .a फ़ाइल को unmodified के साथ उपयोग कर सकता हूं * .dll, और * .h फ़ाइलों को एक क्यूटी जीसीसी परियोजना में?

+3

मेरा मानना ​​है कि यह जटिलता विंडोज के लिए विशिष्ट है। लिनक्स पर क्यूटी का उपयोग करते समय आपके पास यह नहीं होगा! –

+2

आप इसे कई प्रश्नों में तोड़ना चाहते हैं (विशेष रूप से "क्या मैं एक्स उत्पन्न कर सकता हूं यदि मेरे पास वाई है" विविधता ... शायद कई लोग इन सवालों में से कुछ का जवाब दे सकते हैं और यदि आपने उन्हें व्यक्तिगत रूप से पूछा (जैसा कि वे सुंदर हैं क्यूटी से असंबंधित) विंडोज़ लिंकिंग के बारे में, आपको तेज प्रतिक्रिया मिल सकती है। जो कुछ भी कहा जा रहा है, सबसे छोटा जवाब मैं आपको दे सकता हूं * यदि आपको * - VisualStudio प्लेटफ़ॉर्म पर समर्थित मानदंड नहीं है, तो आपको MinGW का उपयोग न करें और आपके पास लंबे समय तक बेहतर अनुभव होगा (यदि ओपन सोर्स लाइब्रेरी निर्भरताओं के साथ लघु रन में कुछ दर्द)। –

+3

-1: एक बार में 16 प्रश्न पूछने के लिए। –

उत्तर

3

एक डीएलएल अनिवार्य रूप से एक संकलित अनुप्रयोग है - बस एक EXE फ़ाइल के बजाय फ़ंक्शन लाइब्रेरी के रूप में। कोई भी अन्य एप्लिकेशन उस डीएलएल के भीतर फ़ंक्शंस को घोषित करके, फ़ंक्शन वाले डीएलएल, और पैरामीटर और रिटर्न वैल्यू और इस तरह के कार्यों का उपयोग कर सकता है।

डीएलएल पहले से ही सिस्टम पर मौजूद होना चाहिए यदि कोई एप्लिकेशन "गतिशील रूप से जुड़े पुस्तकालयों" का उपयोग करके संकलित किया गया है, तो आपको या तो अपने इंस्टॉलर में आवश्यक DLL शामिल करना होगा, या उम्मीद है कि वे पहले से ही लक्षित कंप्यूटर पर मौजूद हैं। डीएलएल का उपयोग करके आपके ऐप का आकार छोटा हो जाता है।

डीएलएल बनाना कोई अन्य एप्लिकेशन बनाने जैसा है - आप बस अपने निर्माण को EXE या जो कुछ भी के बजाय डीएलएल के रूप में लक्षित करते हैं।

कोई भी एप्लिकेशन बनाने के लिए - डीएलएल, EXE या अन्यथा - आपको आवश्यक स्रोत कोड और शीर्षलेख की आवश्यकता है। .h फ़ाइलों में फ़ंक्शंस और डेटा प्रकारों और कक्षाओं और व्हाट्नॉट के लिए घोषणाएं होती हैं - उनमें शायद ही कभी कोड होता है। ए .def एक .h की तरह बहुत है, लेकिन आमतौर पर एक लिंकर के लिए निर्देशों का एक सेट है।

जब आप संकलित करते हैं, एक .h या .c या जो भी .obj - ऑब्जेक्ट फ़ाइल में बदल जाता है। आपके डीएलएल या EXE बनाने के लिए एकाधिक ऑब्जेक्ट फ़ाइलें एक साथ जुड़ी हुई हैं।

ए। एलआईबी फ़ाइल एक स्थैतिक पुस्तकालय है - अनिवार्य रूप से .obj फ़ाइलों (या एक .obj) का एक गुच्छा जो लिंकिंग चरण के लिए संयुक्त किया गया है।

.obj और .lib फ़ाइलों का प्रारूप एक कंपाइलर के लिए विशेष हो सकता है, और वे संकलक के बीच शायद ही कभी संगत हैं। आपके पास मूल कोड कोड होना चाहिए, या विशेष रूप से आपके कंपाइलर के लिए बनाया गया .obj या .lib होना चाहिए।

जब आप "गतिशील रूप से जुड़े पुस्तकालयों" के साथ EXE बनाना चुनते हैं, तो यह डीएलएल की अपेक्षा करेगा जो इसका उपयोग कर सके। जब आप "स्थाई रूप से जुड़े पुस्तकालय" चुनते हैं, तो लिंकर EXE बनाने से पहले आवश्यक .lib फ़ाइलों का पता लगाएगा, और आपको उन DLL की आवश्यकता नहीं होगी।

15

शायद शुरुआत में शुरुआत करना और खुद से आगे बढ़ना और मूल मुद्दे का वर्णन करना उचित नहीं है। इस उत्तर से कई प्रश्नों को प्राप्त किया जा सकता है।

शुरुआत एबीआई (एप्लिकेशन बाइनरी इंटरफ़ेस) है। यह

  • जैसी चीज़ों को परिभाषित करता है जैसे फ़ंक्शन कहलाता है, उदा। कौन से पैरामीटर उस रजिस्ट्रार में जाते हैं या स्टैक पर किस स्थान पर
  • ऑब्जेक्ट्स कैसे निकाले जाते हैं, उदाहरण के लिए अपवादों को फेंक दिया जाता है। जहां "vtable सूचक" चला जाता है, क्या गद्दी प्रयोग किया जाता है
  • कितना बड़ा निर्माण में डेटा प्रकार
  • हैं कैसे फ़ंक्शन नाम "घायल" प्रतीकों में हैं
  • कैसे प्रकार की जानकारी से बाहर रखी है
  • मानक पुस्तकालय वर्ग के लेआउट
  • आदि

अधिकांश प्लेटफार्मों एक सी ABI लेकिन एक सी ++ ABI परिभाषित नहीं करते परिभाषित करते हैं। नतीजतन कंपाइलर अपने स्वयं के एबीआई को परिभाषित करता है (सी सामान को छोड़कर सब कुछ के लिए जो आमतौर पर वहां होता है)। यह ऑब्जेक्ट फ़ाइलों को उत्पन्न करता है जो विभिन्न कंपाइलरों के बीच असंगत होते हैं (कभी-कभी एक ही कंपाइलर के संस्करणों के बीच भी)।

आम तौर पर, यह किसी भी तरह अजीब दिखने वाले नामों में खुद को प्रकट करता है: अलग-अलग एबीआई जानबूझकर एक निष्पादन योग्य को जोड़ने से रोकने के लिए अलग-अलग नाम का उपयोग करते हैं जो वैसे भी काम नहीं करेगा। इन चारों ओर काम करने के लिए आपकी सबसे अच्छी शर्त एक ही कंपाइलर का उपयोग करके सभी घटकों का निर्माण करना है।

यदि आप यह निर्धारित करना चाहते हैं कि लाइब्रेरी किस कंपाइलर के साथ बनाई गई है, तो आप उचित टूल का उपयोग करके इसकी सामग्री देख सकते हैं। मुझे लगता है कि आप Windows के लिए कहा, लेकिन मैं केवल यूनिक्स उपकरण पता (वे MinGW के साथ उपलब्ध हो सकता है):

  • एनएम
  • ar निर्माण करने के लिए (कम या ग्रेप साथ आम तौर पर एक साथ) प्रतीक नाम को देखने के लिए या पुस्तकालयों शौकीन को
  • तार वस्तु में एम्बेडेड विशेष तार सभी स्ट्रिंग्स को खोजने के लिए
  • C++ filt उनकी सी में प्रतीकों demangle को
  • अध्यक्ष का निरीक्षण ++ घोषणा

प्रतीकों को देखते हुए आमतौर पर उन संकलकों की पहचान उत्पन्न होती है जो उन्हें उत्पन्न करती हैं। यदि आपने उन्हें अक्सर बार-बार देखा है, तो आप एबीआई को प्रतीकों से भी बता सकते हैं।

इस क्षेत्र में बहुत कुछ है लेकिन मैं सहनशक्ति से बाहर चला गया हूं ... :-) किसी भी मामले में, मुझे लगता है कि यह ऊपर दिए गए कई प्रश्नों का उत्तर देता है।

7

मैं इस प्रश्न पर ठोकर खाई जब उपकरण :: कोड के लिए ब्लॉक :: ब्लॉक C++ कंपाइलर का उपयोग कर .a फ़ाइल बनाने के लिए उपयोग करने के लिए टूल की खोज करते समय। कोड: ब्लॉक MinGW gcc संकलक का उपयोग करता है।मुझे लगता है कि यह मेरी नीचता को मान्य करने के लिए Google पर काफी अधिक था।

डायनामिक लिंक लाइब्रेरीज़ (डीएलएस) मिश्रित गुच्छा हैं। कुछ को ऐसे तरीके से संकलित किया जा सकता है जो उन्हें प्रोग्रामिंग भाषा और कंपाइलर के बाहर उपयोग करने में बहुत मुश्किल बनाता है।

अक्सर हालांकि डीएल एक स्वच्छ सी इंटरफेस के साथ बनाया जाता है। जब ऐसा होता है तो आपके प्रश्नों के उत्तर जो मुझे लगता है कि मैं जवाब दे सकता हूं:

1: यह कोई प्रश्न नहीं है।

2, 9: हाँ

3, 10: कोई

4, 11: हाँ। MinGW में एक उपकरण (dlltool.exe) शामिल है जो एक .dll और a .def फ़ाइल लेता है और एक .a फ़ाइल बनाता है एमएस विजुअलस्टूडियो में एक ही उपकरण करने के लिए एक टूल (जिसे मुझे लगता है lib.exe कहा जाता है) भी शामिल है। और यदि आप किसी अन्य कंपाइलर का उपयोग शुरू करते हैं तो आपको शायद पता चलेगा कि उनके पास एक टूल भी है। Borlands कंपाइलर्स implib.exe उपकरण था।

5, 12: हां (एक ही 4 के रूप में)

6, 13: बेंच ... मुझे नहीं लगता कि dll के पर एक समय समाप्ति तिथि है, लेकिन वे सही ऑपरेटिंग सिस्टम के लिए संकलित किया जाना चाहिए है।

8, 16: आप .a या उदारीकरण बनाने के लिए .def की जरूरत है, अगर आप इसे नहीं है, यह वास्तव में posible है बनाने के लिए है कि .dll से

0

प्रश्न 1: आपको चाहिए .h फ़ाइल आयात करें और .a लिंकर कमांड द्वारा फ़ाइल करें और अपने .exe आउटपुट के पास .dll कॉपी करें।

प्रश्न 2: आप .def फ़ाइल

set PATH=C:\Program Files\CodeBlocks\MinGW\bin;%PATH% 

dlltool.exe -d libfftw3-3.def -l libfftw3-3.a 

प्रश्न 3 से .a फ़ाइल बना सकते हैं: कोई। आप मैन्युअल रूप से .def फ़ाइल बना सकते हैं और .a फ़ाइल बना सकते हैं।

सवाल 4,5: हाँ

प्रश्न 6: मुझे लगता है कि यह अपने संकलक पर नहीं अपने हार्डवेयर और ऑपरेशन सिस्टम पर निर्भर है।

प्रश्न 7: मुझे नहीं पता।

प्रश्न 8: आप .def नहीं

प्रश्न 9 केवल .h.a.dll की जरूरत है: .lib फ़ाइलें दृश्य स्टूडियो के लिए है।

प्रश्न 10: कोई आप .def और .dll जरूरत .lib बनाने के लिए और अगर आप इसे नहीं है आप . def खुद बना सकते हैं।

set PATH=C:\Program Files\Microsoft Visual Studio 12.0\VC\bin;%PATH% 

lib /machine:x86 /def:libfftw3-3.def 

या

lib /machine:x64 /def:libfftw3-3.def 

प्रश्न 11: हाँ, मैं आप ऊपर बताया।

प्रश्न 12: हाँ

प्रश्न 13: नहीं।

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