2012-12-24 16 views
5

के लिए आवश्यकताएं मैंने इन दो SO प्रश्नों को पढ़ा है: Which runtime libraries to ship? और License of runtime libraries included in GCC? - दोनों बहुत उपयोगी थे लेकिन काफी कुछ नहीं जो मैं ढूंढ रहा था।शिपिंग रनटाइम लाइब्रेरी/डीएलएल

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

संपादित करें: इसके बजाय उदाहरण नीचे देखें, यह भ्रामक था।

विशेष रूप , अगर मैं एक Windows मशीन पर एक सी ++ प्रोग्राम, MinGW के माध्यम से जीसीसी के साथ संकलित लिखते हैं, और एक और मशीन पर उसे चलाना चाहते हैं:

  • मैं libstdc भेजने के लिए है ++। मेरे कार्यक्रम के साथ डीएलएल?
  • क्या यह एकल फ़ाइल है (मुझे निष्पादन योग्य निर्देशिका में रखा गया है) प्रोग्राम को चलाने की अनुमति देने के लिए पर्याप्त है?

इसके अलावा, एक समान उदाहरण, इस समय को छोड़कर यह एक उद्देश्य-सी प्रोग्राम है। Libobjc.dll फ़ाइल को अन्य मशीन पर भेज रहा है ताकि प्रोग्राम को सही तरीके से निष्पादित करने की अनुमति मिल सके?

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


संपादित करें: जवाब में भवन के जवाब देने के लिए, मुझे लगता है मैं स्पष्ट करना चाहिए कि यह क्या है मैं तलाश कर रहा हूँ। मुझे पता है कि मेरे प्रोग्राम का उपयोग करने वाले आवश्यक डीएलएल (/ dylibs, आदि) की पहचान कैसे करें, (हालांकि मैं मैन्युअल रूप से उस काम को करने के आदी हूं; मैंने किसी भी उपकरण के बारे में नहीं सुना था)। मेरा सवाल और अधिक था "अब मैं क्या करूँ?"

एक अधिक सामान्य उदाहरण शायद जरूरत है:

चलो कहते हैं कि मैं एक कार्यक्रम C++, C और/या ऑब्जेक्टिव-सी (2) कोड से ली गई फ़ाइलों वस्तु है जो लिखा है करते हैं। मैंने कुछ विंडोज एपीआई कोड का उपयोग किया है जो MinGW के जीसीसी का सफलतापूर्वक संकलित संकलित है। मेरे पास विजुअल स्टूडियो (सी ++) में एक कस्टम डीएलएल भी लिखा गया है।

मैंने पहचान की है कि कौन सा डीएलएल मेरा प्रोग्राम रनटाइम पर उपयोग करेगा (जिसमें से एक जीसीसी का libobjc.dll हो सकता है, मुझे यकीन नहीं है कि यह विंडोज मशीन पर कोई फर्क पड़ता है, लेकिन मैं इसे बनाना चाहता हूं यथासंभव सामान्य) - "पूर्वापेक्षाएँ डीएलएल"।

मैं अपने सहयोगियों के कंप्यूटरों, जिनमें से अधिकांश विंडोज 7 चलाने पर इसे चलाने के लिए चाहते हैं, लेकिन कुछ अब में बहुत पूर्णता के लिए के लिए शुरू शुरू Windows 8 चलाएँ:

  • मैं की जरूरत है मेरे सहकर्मियों के कंप्यूटर पर पूर्व-डीएलएल को स्थानांतरित करने के लिए?
  • मुझे उन्हें किस निर्देशिका में रखना चाहिए? (exe निर्देशिका/एक सिस्टम निर्देशिका?)
  • एक बार जगह पर, क्या इन डीएलएल की उपस्थिति प्रोग्राम को सही तरीके से निष्पादित करने की अनुमति देगी? (मान लीजिए कि उन्हें कहां मिलना है)
  • क्या कोई अन्य फाइलें हैं जिन्हें डीएलएल के साथ स्थानांतरित किया जाना चाहिए?

मूल रूप से मैं सिस्टम रनटाइम आवश्यकताओं के संदर्भ में किसी अन्य मशीन पर एप्लिकेशन को विकसित करने और चलाने के लिए पूरी विचार-प्रक्रिया निर्धारित करने का प्रयास कर रहा हूं।

उत्तर

4

डीएलएल लोड करते समय, पहली जगह विंडोज दिखता है वह निर्देशिका है जो एक्सई है। इसलिए यह शायद डीएलएल को रखने के लिए ठीक काम करेगा।

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

यदि आप जीसीसी से डीएलएल शामिल करते हैं तो अपने सॉफ़्टवेयर के साथ लाइसेंस फ़ाइल शामिल करना सुनिश्चित करें, क्योंकि जीपीएल को इसकी आवश्यकता है।

+1

Win8 स्टोर ऐप्स के लिए यह देखें .. http://blogs.msdn.com/b/vcblog/archive/2012/09/28/10354327.aspx –

3

libstdC++ आवश्यक रूप से पर्याप्त नहीं है। आपको लगभग निश्चित रूप से libgcc की भी आवश्यकता है, लेकिन वास्तविक निर्भरता आपके विशेष एप्लिकेशन के साथ भिन्न होने के लिए उत्तरदायी हैं।

सर्वोत्तम तरीके यह निर्धारित करने के लिए कि आपको अपने आवेदन के साथ जहाज भेजने की आवश्यकता है, अपने EXE को Dependency Walker जैसे प्रोग्राम में लोड करना है।

बस एक उदाहरण के रूप में, मैंने एक परीक्षण सी ++ प्रोग्राम संकलित किया है जो बस एक std :: स्ट्रिंग प्रिंट करता है। As you can see, यह सीधे विंडोज़ के साथ आने वाले दो मॉड्यूल पर निर्भर करता है; libgcc_s_dw2-1.dlllibstdc++-6.dll के अतिरिक्त।

आपको यह सुनिश्चित करने के लिए प्रत्येक डीएलएल के नीचे पेड़ का विस्तार करना याद रखना चाहिए कि यदि यह बी पर निर्भर करता है, तो बी पर निर्भर करता है, भले ही ए सी पर निर्भर न हो, भले ही ए सीधे सी पर निर्भर न हो) ।

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

अद्यतन: रूप xtofl अंक इस बाहर पुस्तकालयों कवर नहीं किया जाएगा LoadLibrary का उपयोग कर गतिशील रूप से भरी हुई। यदि आप इस आधार को कवर करना चाहते हैं, तो प्रक्रिया मॉनिटर का उपयोग करके जांचें कि जब आप एप्लिकेशन चलाते हैं तो DLL फ़ाइलों को किस प्रकार स्पर्श किया जाता है। (बाढ़ न होने के क्रम में अपने EXE के पथ के साथ 'छवि पथ' मानदंड जोड़ें।) इसमें अतिरिक्त लाभ है कि इसमें सभी फाइलें, रजिस्ट्री प्रविष्टियां इत्यादि शामिल हैं, जो कि आपका एप्लिकेशन केवल डीएलएल पर निर्भर करता है।

+0

'निर्भर करता है 'स्थिर रूप से लोड की गई बाइनरी उत्पन्न करेगा। उदाहरण के साथ लोड डीएलएस 'लोड लाइब्रेरी (...)' मिस जाएगा, लेकिन ये आपके नियंत्रण में हैं – xtofl

+1

सबसे अच्छा तरीका उपयोग नहीं करना है। ग्राउंड अप से अपने ऐप्स निर्भरताओं को समझना सबसे अच्छा तरीका है। संकलक दस्तावेज को पढ़ने की आवश्यकता होगी। –

+0

आप अपने आवेदन को निर्भरता वॉकर (प्रोफ़ाइल-> प्रारंभ प्रोफाइलिंग) से भी चला सकते हैं। इसके बाद यह उन पुस्तकालयों के साथ दृश्य को अपडेट करेगा जो वास्तव में रनटाइम पर लोड होते हैं। –