2010-10-15 13 views
12

यह सवाल मुझे थोड़ी देर के लिए परेशान कर रहा है। के दो निम्नलिखित कार्यक्रमों पर ध्यान दें:सी ++ प्रोग्राम को चलाने के लिए क्या आवश्यक है?

#incude <iostream> 
int main() 
{ 
    std::cout << "Hello, World!"; 
} 

और

int main() 
{ 
    int x = 5; 
    int y = x*x; 
} 
  1. विंडोज: पहला उदाहरण, स्वाभाविक रूप से, कुछ सिस्टम .dll कंसोल के लिए की आवश्यकता है। मैं समझता हूँ कि। दूसरे के बारे में क्या? क्या इसे चलाने के लिए कुछ चाहिए? कुछ रनटाइम पुस्तकालय? वैसे, रनटाइम पुस्तकालय वास्तव में क्या करते हैं?
  2. लिनक्स: कोई विचार नहीं, क्या आप मुझे प्रबुद्ध कर सकते हैं?

मुझे पता है कि यह कंपाइलर और ओएस पर निर्भर करता है, लेकिन मुझे या तो सामान्य उत्तर या विशेष उदाहरणों की आवश्यकता है। TIA।

+2

दुनिया की सभी किस्मत! – Chubsdad

+0

@Chubsdad true: D –

+1

आपका दूसरा उदाहरण किसी भी प्रसंस्करण की आवश्यकता नहीं है, इसके अलावा 'मुख्य()' से 'वापसी 0; 'के कारण होता है। यह किसी भी प्रकार के कार्यों को नहीं बुलाता है, और 'अस्थिर' चर का उपयोग नहीं करता है, इसलिए इसका कोई अवलोकन योग्य व्यवहार नहीं है। –

उत्तर

1

विंडोज़ पर सी प्रोग्रामों के लिए सीआरटी लाइब्रेरी की आवश्यकता होती है जो विंडोज के साथ आती हैं। सी ++ को कभी-कभी "सी ++ पुनर्वितरण योग्य" कहा जाता है। उन्हें जोड़ने के माध्यम से ऐप में एम्बेड किया जा सकता है लेकिन इससे EXE बड़ा हो जाएगा।

+0

सीआरटी को प्रोग्राम – Abyx

+0

@Andrey के साथ स्थैतिक रूप से जोड़ा जा सकता है। क्या यह विजुअल स्टूडियो में विकल्प है जो रनटाइम लाइब्रेरी कहता है और आप इसे एमटी एमडी एमटीडी आदि में सेट कर सकते हैं? –

+0

@ एंड्रे।और, यदि आप निर्दिष्ट करते हैं कि प्रोग्राम को सी ++ रेडिस्ट की आवश्यकता होती है, तो मैं आपके उत्तर –

7

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

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

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

+1

-1 "दूसरा रनटाइम पुस्तकालयों का कोई उपयोग नहीं करता है"। यह सामान्य रूप से प्रक्रिया स्टार्टअप और समाप्ति के लिए रनटाइम लाइब्रेरी पर निर्भर करता है। विंडोज़ में रनटाइम lib प्रोग्राम एंट्री पॉइंट प्रदान करता है और 'मुख्य' के बाद यह 'ExitProcess'' (अगर मुझे सही नाम याद है) कहते हैं। –

+2

@ एएलएफ, क्या आपने निम्न पाठ को नहीं देखा: '" सी स्टार्टअप कोड के अलावा ... "'? यह परिभाषा का विषय भी हो सकता है। स्टार्टअप और समाप्ति कोड _may_ सीआरटी में है लेकिन मैंने कई स्थितियों को देखा है जहां यह एक स्टैंडअलोन 'start.o' में है और मानक लाइब्रेरी के साथ कुछ भी नहीं है। मैं स्पष्ट करूंगा। – paxdiablo

+1

यह वास्तव में बहस योग्य है कि क्या init/term code को आरटीएल का हिस्सा माना जा सकता है। शारीरिक रूप से, यह जुड़ा हुआ है, तो हाँ यह है। लेकिन तार्किक रूप से, यह एप्लिकेशन उन्मुख कॉल करने योग्य संसाधनों या डेटा को उजागर नहीं कर रहा है, इसलिए ऐसा नहीं है। यह देखते हुए कि उत्तर स्पष्ट रूप से इसके लिए जिम्मेदार है, -1 निश्चित रूप से अनिश्चित है। – Stabledog

2

पहला प्रोग्राम धारा I/O करता है, जिसका अर्थ है कि इसे ओएस द्वारा प्रबंधित संसाधनों (कंसोल, गुई) से बातचीत करना है। तो, आखिरकार, ओएस को एक सिस्टम डीएल में लागू एपीआई के माध्यम से बुलाया जाना है।

विंडोज़ पर दूसरे प्रोग्राम के लिए कोई पुस्तकालय की आवश्यकता नहीं है। मुझे यकीन है कि लिनक्स पर भी यही सच है।

7

विंडोज अनुप्रयोगों के लिए आप सभी निर्भरताओं को देखने के लिए निर्भरता वॉकर का उपयोग कर सकते हैं।

+1

http://www.dependencywalker.com/ - निर्भरता की जांच करने के लिए एक जीवन बचतकर्ता की बात आती है। –

+1

लिनक्स समतुल्य 'ldd' होगा: एक आदेश जो आपके द्वारा निर्भर पुस्तकालयों को सूचीबद्ध करता है (और जहां यह उन्हें पाता है)। संदर्भित प्रतीकों की सूची प्राप्त करने के लिए 'एनएम' भी है, जो 'यू' (अपरिभाषित) के साथ चिह्नित हैं, वे हैं जिन्हें आप जायेंगे और एक और डीएलएल में चुनेंगे। –

1

आपके प्रश्न के पहले भाग के लिए - आपको कई सदस्यों द्वारा उत्तर दिया गया है। लेकिन मैं जो कह रहा हूं वह सामान्य है और दोनों मामलों के लिए आवश्यक है - (यदि आपको पता नहीं है)

किसी भी प्रोग्राम को चलाने के लिए, इसे आवश्यक संसाधनों के साथ प्रदान किया जाना चाहिए। 1 भाग टीम का जवाब देने से पहले ही कई वस्तुओं को सूचीबद्ध किया गया है।

लेकिन सामान्य रूप से, इसकी आवश्यकता क्या है अच्छी तरह से परिभाषित पता स्थान (मुख्य स्मृति में), इसकी गुणधर्म और सीपीयू समय। ऑपरेटिंग सिस्टम यह सुनिश्चित करता है कि जब आप अपना प्रोग्राम निष्पादित करते हैं तो आपको वह मिलता है। जब तक कुछ हास्यास्पद संघर्ष नहीं होता है तब तक आपका कार्यक्रम प्राप्त नहीं होगा (और यही कारण है कि मुझे लगता है कि चब्सदाद ने टिप्पणी की "आपको भाग्य की आवश्यकता है")।

ओएस निर्धारण, सीपीयू स्मृति से निर्देश/डाटा को लाना और फिर इसे क्रियान्वित करने ... सभी रूपों एक "मशीन" है कि अपने कार्यक्रम कार्यान्वित पूछ।

एंट्री पॉइंट (या निष्पादित करने के लिए आपके प्रोग्राम में पहला बिंदु) ढूंढना सब कुछ संकलित समय (उदाहरण के लिए मुख्य फ़ंक्शन) या जब आप कुछ सिस्टम कॉल जैसे exec() (यूनिक्स में) का उपयोग करके अपना प्रोग्राम लोड करते हैं)/CreateProcess() (विंडोज़ में)।

2

उन्हें जीसीसी के साथ संकलित करें, और निष्पादन योग्य नामित होते हैं यह 'हाय', सांत्वना लिखने में:

ldd hi 

आप साझा ऑब्जेक्ट (गतिशील पुस्तकालयों) जो अपने कार्यक्रम से जुड़े हैं दे देंगे।

ldd tifftest 
    libtiff.so.3 => /usr/lib/libtiff.so.3 (0x4001d000) 
    libc.so.6 => /lib/libc.so.6 (0x40060000) 
    libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40155000) 
    libz.so.1 => /usr/lib/libz.so.1 (0x40174000) 
    /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) 
+0

मुझे आश्चर्य है कि यह libjpeg.so – hiena

+1

@hiena का उपयोग क्यों करता है: यह देखते हुए कि कार्यक्रम "tifftest" है, मुझे संदेह होगा कि यह छवि प्रारूपों के लिए एक परीक्षण कार्यक्रम है। –

+1

वास्तव में अजीब। मेरे बॉक्स पर, सी ++ प्रोग्राम हमेशा लिनक्स-गेट, libstdC++, libm, libgcc_s, libc और ld-linux से पसंद किए जाते हैं। सी प्रोग्राम केवल लिनक्स-गेट, libc और ld-linux पसंद हैं। कोई libtiff, libjpeg या libz, जब तक स्पष्ट रूप से अनुरोध नहीं किया। –

1

लिनक्स पर, किसी भी सी कार्यक्रम स्थिर कुछ सीआरटी पुस्तकालयों से जुड़ा हुआ है:

बस त्वरित जवाब यहाँ

एक निर्गम है। कार्यक्रम का वास्तविक प्रवेश बिंदु _start() फ़ंक्शन /usr/lib/crt1.o में परिभाषित किया गया है। यह फ़ंक्शन कुछ libc फ़ंक्शन जैसे __libc_start_main() पर कॉल करता है। इस प्रकार यदि आप अभी भी libc पुस्तकालय ...

आप libc बिना कर सकता है की जरूरत है, लेकिन यह मुश्किल है। आपको अपने एंट्री पॉइंट _start() का नाम बदलना होगा, या लिंकर को main() पर शुरू करने का निर्देश देना होगा। और प्रोग्राम को पूरा होने पर _exit() सिस्टम कॉल जारी करने के लिए आपको कुछ इनलाइन असेंबली की भी आवश्यकता होगी, अन्यथा यह केवल क्रैश होगा। और निश्चित रूप से, gcc फ्रंटएंड के बजाय ld कमांड के साथ स्पष्ट रूप से लिंक करें।

2

ठीक है, को देखने के एक अधिक सामान्य दृष्टिकोण से इस पर ध्यान दें:

  • के साथ शुरू करने के लिए, आप एक संगत सीपीयू कि संकलक उत्पादन का लक्ष्य मशीन के साथ काम करता है के साथ एक कंप्यूटर की आवश्यकता होगी । आपको लगता है कि यह स्पष्ट है लेकिन यह मानते हुए कि कोड x86 मशीन कोड में संकलित है, यह अल्फा सीपीयू पर नहीं चलेगा जो विभिन्न निर्देशों का उपयोग करता है। वैकल्पिक रूप से, यदि आप x64 मशीन कोड को संकलित करते हैं, तो यह x86- केवल CPU पर नहीं चलेंगे। तो सी ++ प्रोग्राम चलाने के लिए सही हार्डवेयर आवश्यक है, जावा जैसी वर्चुअल-मशीन आधारित भाषाओं के विपरीत, जो कि उस सार को दूर करता है।

  • आपको सही ऑपरेटिंग सिस्टम की भी आवश्यकता होगी। मैं प्रोग्रामिंग पोर्टिंग पर एक विशेषज्ञ नहीं हूं लेकिन मुझे नहीं लगता कि एक एकल निष्पादन योग्य बनाना संभव है जो सी ++ में कई ऑपरेटिंग सिस्टम पर चलता है। उदाहरण के लिए, विंडोज़ में आपके दूसरे उदाहरण को संकलित करने के लिए आपके main() फ़ंक्शन पर वास्तविक कॉल से पहले और बाद में दृश्यों के पीछे बहुत सारे रनटाइम-लाइब्रेरी कोड होंगे। यह चीजों को ढेर तैयार करने और सीआरटी पुस्तकालय शुरू करने जैसी चीजें करेगा। विंडोज़ के लिए सीआरटी विंडोज एपीआई के माध्यम से लागू किया गया है। आप लाइब्रेरी को स्थिर लिंक कर सकते हैं, इसलिए कोई सीआरटी डीएलएल आवश्यक नहीं है, लेकिन आपके प्रोग्राम में कोड अभी भी विंडोज एपीआई को कॉल करता है, इसलिए अभी भी मंच निर्भर है। एक प्रयोग के रूप मैं दृश्य स्टूडियो के साथ Windows पर स्थिर जोड़ने के साथ एक खाली कार्यक्रम संकलित, और निर्भरता वाकर के अनुसार यह अभी भी HeapCreate और ExitProcess जैसे कार्यों के लिए Kernel32.dll संदर्भ देता है। तो 'खाली' कार्यक्रम अभी भी कुछ उपयोगी करने की तैयारी में, आपके लिए कुछ भी उपयोगी काम करता है या नहीं, इस पर निर्भर करता है कि आपके लिए ऑपरेटिंग सिस्टम सामान का पूरा समूह है।

यह भी ध्यान रखें वहाँ अच्छी तरह से कम से कम ऑपरेटिंग सिस्टम संस्करण हो सकता है: दृश्य स्टूडियो 2010 EncodePointer और DecodePointer की जाने वाली कॉल की वजह से, Windows XP SP2 की आवश्यकता है या इसके बाद भी एक खाली कार्यक्रम के लिए। this question देखें।

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

  • ऑपरेटिंग सिस्टम की कॉन्फ़िगरेशन के आधार पर, आपको निष्पादन योग्य प्रोग्राम लॉन्च करने के लिए पर्याप्त सुरक्षा विशेषाधिकार की आवश्यकता हो सकती है।

तो, संक्षेप में, यहां तक ​​कि स्थिर जोड़ने के साथ एक खाली सी ++ कार्यक्रम चलाने के लिए, आप इस कार्यक्रम को पूरा करने के लिए सही सीपीयू, ऑपरेटिंग सिस्टम, निष्पादन योग्य चलाने की अनुमति, और स्मृति/प्रसंस्करण समय की जरूरत है। जावा या .NET जैसी वीएम प्रौद्योगिकियों की तुलना में, आवश्यकताएं शायद प्रोग्राम को चलाने के लिए सही वर्चुअल मशीन, आवश्यक विशेषाधिकार, और आवश्यक स्मृति/CPU समय को कम कर देगी। यह उतना आसान नहीं हो सकता जितना लगता है: आपको वर्चुअल मशीन के सही संस्करण की आवश्यकता हो सकती है, जैसे .NET Framework 4.0। यह आपकी वितरण प्रक्रिया को जटिल कर सकता है क्योंकि मशीन के लिए संपूर्ण जेवीएम या .NET ढांचे को अद्यतन करने के लिए समय लेने वाली प्रक्रिया हो सकती है जो प्रशासक विशेषाधिकारों और शायद एक इंटरनेट कनेक्शन की आवश्यकता होती है। कुछ संकीर्ण मामलों में, यह एक सौदा ब्रेकर हो सकता है, क्योंकि दुर्लभ अवसरों पर यह कहने में सक्षम होना आसान हो सकता है कि यह "एक्सपी के बाद से किसी भी x86- संगत विंडोज ऑपरेटिंग सिस्टम पर चलाएगा" के विपरीत "नवीनतम वर्चुअल वाले किसी भी मशीन के विपरीत मशीन जो कल ही जारी की गई थी "। अधिकांश उद्देश्यों के लिए, हालांकि, तथ्य यह है कि वर्चुअल मशीन आपको (सिद्धांत में) सीपीयू के बारे में भूलने और ऑपरेटिंग सिस्टम प्रोग्राम के वितरण को आसान बनाता है; सी ++ के साथ, आप प्लेटफार्मों और सीपीयू के प्रत्येक संयोजन के लिए अलग-अलग निष्पादन योग्यों को कम से कम संकलित करने की आवश्यकता है, भले ही आप जिन पुस्तकालयों का उपयोग कर रहे हैं, उनकी अतिरिक्त आवश्यकताओं के बावजूद।

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