2009-05-01 14 views
7

मैं एक C++ प्रोग्राम बनाने हूँ में dll संकलित करने के लिए, लेकिन मैं उपयोगकर्ता के लिए सिर्फ एक exe फ़ाइल पेशकश करने में सक्षम होना चाहता हूँ। हालांकि, मैं पुस्तकालयों का उपयोग कर रहा हूं (दूसरों के बीच कर्ल) जिसमें कुछ डीएल है। क्या इन डीएलएस को .exe फ़ाइल में संकलित करना संभव है?सी ++ कैसे एक .exe

मैं कोड :: ब्लॉक और मिंगव का उपयोग करता हूं।

+1

कृपया ध्यान दें कि इसमें लाइसेंसिंग समस्याएं भी हो सकती हैं। जैसे कुछ लाइसेंस केवल स्थिर लिंकिंग की अनुमति देते हैं यदि आप अपने प्रोग्राम का पूर्ण स्रोत कोड प्रदान करते हैं। –

उत्तर

9

आदेश में प्राप्त करने के लिए है कि आप static linking की आवश्यकता होगी। इसके लिए यह आवश्यक है कि आपके सभी पुस्तकालय (और पुस्तकालय जो वे पुनरावर्ती पर निर्भर करते हैं) को स्थिर पुस्तकालयों के रूप में उपलब्ध होना आवश्यक है। ध्यान रखें कि आपके निष्पादन योग्य का आकार बड़ा होगा, क्योंकि यह उन स्थिर पुस्तकालयों से सभी कोड ले जाएगा। यही कारण है कि साझा पुस्तकालयों (डीएलएल) का आविष्कार पहले स्थान पर किया गया था, ताकि अनुप्रयोगों के बीच सामान्य कोड साझा किया जा सके। हालांकि यह हमेशा so well on windows काम नहीं करता है।

मुझे लगता है कि आप वास्तव में क्या चाहते हो सकता है एक installer कि आपके निष्पादन को स्थापित करता है और सभी यह निर्भर पुस्तकालयों है।

+1

मैं ज्यादातर समय पोर्टेबल्स पसंद करता हूं, खासकर टूल्स के लिए। इंस्टॉलर प्रोग्राम जोड़ें में इंस्टॉलर, स्टार्ट मेनू, और प्रोग्राम सूची को इंस्टॉलर क्लटर करता है।यही कारण है कि हर बार जब लोग इस तरह के प्रश्न के लिए इंस्टॉलर्स का सुझाव देते हैं तो मैं चिल्लाता हूं। YMMV। फिर भी, पहले अनुच्छेद के लिए upvoted। – syaz

3

आप उपयोग कर सकते हैं ILMerge

+0

मुझे लगता है कि ILMerge केवल प्रबंधित कोड के साथ काम करता है, मूल कोड नहीं। – Ferruccio

+0

यह सच है। मुझे लगता है कि वे एक डीएल पैकेज करने की कोशिश कर रहे थे जो वे .NET – Ichorus

+0

में काम कर रहे थे। यह भी सच है कि (एक माइक्रोसॉफ्ट बोली) सी ++ को आईएल में संकलित किया जा सकता है। –

2

आप XBundler जैसे कुछ विशेष पैकर उपकरण की जरूरत है।

0

सामान्य रूप से, नहीं। डीएलएल के पास कुछ विशेष व्यवहार होता है जो गैर-तुच्छ है, जैसे कि लोडर लॉक प्राप्त करते समय उन्हें लोड किया जाता है और उन बिंदुओं पर डेलमेन को कॉल किया जाता है। जबकि एक सैद्धांतिक लिंकर प्रत्येक DllMain को एप्लिकेशन मुख्य() से बुलाया जा सकता है, यह लोडेड लॉक के तहत नहीं होगा। यह लोडर लॉक ओएस के नियंत्रण में है। इसके अलावा, डीएलएल को उनके डीएलएलमेन के माध्यम से नए धागे की अधिसूचना दी जाती है, और यह भी नकली के लिए लगभग असंभव होगा।

3

मैं एक बार dll2lib उपयोगिता बारे में जाना। दिलचस्प टुकड़ा, हालांकि मूल्यवान एक। यह आपको एक स्थिर पुस्तकालय में लगभग किसी भी डीएल को रूपांतरित करने की अनुमति देता है, जिसे बाद में आपके आवेदन के साथ ठोस एक्सई उत्पन्न करने के लिए जोड़ा जा सकता है। आईआईआरसी, मुफ्त संस्करण ऐसी जेनरेट लाइब्रेरी से फ़ंक्शन दर्ज करने पर कुछ अधिसूचना (संदेशबॉक्स) दिखाएगा।

4

वहाँ तुम क्या चाहते हो सकता है कि 2002 से DDJ में एक लेख है:

मूल रूप से यह DLL को जोड़ने MSVC की 'देरी लोड' सुविधा और पैकेजिंग का उपयोग करने का एक संयोजन का उपयोग करता EXE में एक एम्बेडेड संसाधन के रूप में डीएलएल। तब डीएलएल को रनटाइम पर स्वचालित रूप से निकाला जाता है जब निर्यात में से किसी एक को कॉल किया जाता है।

मैं तो मैं वास्तव में यह कैसे अच्छी तरह से काम पर टिप्पणी नहीं कर सकता इस तकनीक का उपयोग नहीं किया है, लेकिन यह यकीन है कि एक चालाक विचार की तरह लगता।

2

तुम सच में यह पूरा करने की जरूरत है, तो आप इस भयानक पुस्तकालय है जो आप स्मृति से एक DLL लोड करने के लिए अनुमति देगा का उपयोग कर सकते हैं। मैंने इसे संसाधन से डीएलएल पढ़ने और इसे मेरे लिए लोड करने के लिए उपयोग किया है।

https://github.com/fancycode/MemoryModule

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