2011-10-22 18 views
8

सी ++ में, यदि मैं लिनक्स का उपयोग करके पोंग की तरह एक साधारण गेम लिखता हूं, तो क्या वही कोड विंडोज और ओएसएक्स पर संकलित किया जा सकता है? मैं कहां कह सकता हूं कि इसे संकलित नहीं किया जा सकेगा?पोर्टेबल आईएस सी ++ कैसे पोर्टेबल है?

+9

जो कि आपके द्वारा उपयोग किए जाने वाले पुस्तकालयों/कार्यों पर निर्भर करता है और क्या वे सभी प्लेटफ़ॉर्म के लिए उपलब्ध हैं ... – Yahia

उत्तर

4

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

तृतीय पक्ष पुस्तकालयों के लिए आप उपयोग कर सकते हैं, प्लेटफ़ॉर्म उपलब्धता आमतौर पर दस्तावेज़ में निर्दिष्ट होती है।

जब जीयूआई प्रश्न पूछता है, तो क्रॉस-प्लेटफ़ॉर्म विकल्प (जैसे क्यूटी) हैं, लेकिन आपको शायद खुद से पूछना चाहिए - क्या यूआई की बात आने पर मुझे पोर्टेबिलिटी चाहिए? कभी-कभी, जीयूआई भाग मंच-विशिष्ट होना बेहतर होता है।

+0

बेशक, कोई मानक-अनुपालन कंपाइलर नहीं हैं [वहां एक होता था, लेकिन फिर मानक बदल गया], प्लस क्रियान्वयन परिभाषित व्यवहार की भीड़, इसलिए "मानक का सम्मान करना" केवल एक कदम है। –

8

सी ++ अल्ट्रा पोर्टेबल है और इसमें एक स्टिक को हिला सकते हैं उससे अधिक प्लेटफॉर्म पर कंपाइलर्स उपलब्ध हैं। जावा जैसी भाषाएं आम तौर पर व्यापक रूप से पार मंच के रूप में चिंतित होती हैं, विडंबना यह है कि वे वास्तव में आमतौर पर सी ++, या सी

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

ऐप्पल मैक के जीयूआई ढांचे को कोको कहा जाता है, और यह एक उद्देश्य-सी पुस्तकालय है, लेकिन उस विकास वातावरण में सी ++ से उद्देश्य सी तक पहुंचना आसान है।

लिनक्स पर जीटीके + और क्यूटी फ्रेमवर्क हैं जो वास्तव में विंडोज और ऐप्पल को पोर्ट किए जाते हैं, इसलिए इनमें से एक सी ++ फ्रेमवर्क आपके "विंडोज़, सेब पर चलने और चलाने के बाद सी ++ में जीयूआई एप्लीकेशन कैसे लिख सकता है मैक और लिनक्स "।

बेशक, क्यूटी को सख्ती से सी ++ के रूप में मानना ​​मुश्किल है - क्यूटी संकेतों और स्लॉट्स के लिए एक विशेष मार्कअप को परिभाषित करता है जिसके लिए पूर्व-संकलन संकलन चरण की आवश्यकता होती है।

+1

यदि आपको गैर-ASCII वर्णों की आवश्यकता है तो टेक्स्ट I/O को पोर्टेबल करना मुश्किल है। – dan04

+3

जावा पर खुदाई क्योंकि यह सी ++ में लागू है एक लाल हेरिंग है। पर्ल, पायथन और रूबी सी में लिखे गए हैं, लेकिन वे बहुत अधिक पोर्टेबल हैं और सी क्रॉस प्लेटफॉर्म कोड करने के लिए एक दुःस्वप्न बनी हुई है। – Schwern

+0

स्टिक्स के लिए एक कंपाइलर भी है, हालांकि हिलना परमाणु नहीं है और आपको स्मृति उपयोग देखने की आवश्यकता है। – ssube

1

यदि आप लिनक्स से विंडोज तक पोर्टिंग करने के बारे में सोच रहे हैं, तो ग्राफ़िकल भाग के लिए OPENGL का उपयोग करके आप अपने प्रोग्राम को दोनों ऑपरेटिंग सिस्टम पर चलाने की स्वतंत्रता देते हैं जब तक कि आप किसी भी सिस्टम विशिष्ट कार्यक्षमता का उपयोग न करें।

12

आपके पास तीन प्रमुख पोर्टेबिलिटी बाधाएं हैं।

पहला, और सरल, सी ++ कोड लिख रहा है जो सभी लक्षित कंपाइलर्स समझते हैं। नोट: यह लेखन से सी ++ मानक तक अलग है। "मानक को लिखने" के साथ समस्या से शुरू होता है: कौन सा मानक? आपके पास C++98, C++03, C++TR1 or C++11 है? ये सी ++ के सभी संशोधन हैं और जितना नया आप कम अनुपालन वाले कंपाइलरों का उपयोग करते हैं, वे होने की संभावना है। सी ++ बहुत बड़ा है, और वास्तव में सबसे अच्छा आप उम्मीद कर सकते हैं कि सी ++ 98 कुछ सी ++ 03 फीचर्स के साथ है।

कंपाइलर्स सभी अपने स्वयं के एक्सटेंशन जोड़ते हैं, और अनजाने में उनका उपयोग करना बहुत आसान है। मानक को लिखना बुद्धिमान होगा, न कि संकलक दस्तावेज के लिए। कुछ कंपाइलरों में "सख्त" मोड होता है जहां वे सभी एक्सटेंशन बंद कर देंगे। आप संकलक में प्राथमिक विकास करना बुद्धिमान होगा जिसमें सबसे सख्त और सर्वोत्तम मानक अनुपालन है। सख्त चेतावनी चालू करने के लिए gcc में -Wstrict झंडे के परिवार हैं। -ansi मानक के साथ संघर्ष जो एक्सटेंशन को हटा देगा। -std=c++98 संकलक को C++ 98 मानक के विरुद्ध काम करने और जीएनयू सी ++ एक्सटेंशन को हटाने के लिए बताएगा।

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

अगला आपका ग्राफिक्स और ध्वनि पुस्तकालय है। इसे सिर्फ क्रॉस प्लेटफार्म नहीं होना है, इसे अच्छे दिखना है और सभी प्लेटफार्मों पर तेज़ होना है। इन दिनों बहुत सारी संभावनाएं हैं, Simple DirectMedia Layer एक है। आपको यह चुनना होगा कि आप किस स्तर पर कोड करना चाहते हैं। क्या आप विस्तृत नियंत्रण चाहते हैं? या आप चाहते हैं कि एक इंजन चीजों का ख्याल रखे? There's an existing answer for this इसलिए मैं विवरण में नहीं जाऊंगा। क्रॉस प्लेटफ़ॉर्म होने के लिए समर्पित एक को चुनना सुनिश्चित करें, न केवल काम पर होता है। आपकी ग्राफिक्स लाइब्रेरी में संगतता कीड़े आपके प्रोजेक्ट को तेज़ी से डुबो सकती हैं।

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

  • फ़ाइल लेआउट
  • फ़ाइल पथ वाक्य रचना (यानी C:। \ Foo \ बार बनाम/foo/बार)
  • Mandatory Windows file locking
  • भिन्न फाइल अनुमति प्रणालियों के
  • भिन्न मॉडल यहाँ एक मुट्ठी भर है इंटरप्रोसेस संचार (यानी कांटा, साझा स्मृति, आदि ...)
  • अलग थ्रेडिंग मॉडल (आपकी ग्राफिक्स लाइब्रेरी को इसे आसान बनाना चाहिए)

वहां आपके पास है। क्या गड़बड़ है, हुह? क्रॉस-प्लेटफ़ॉर्म प्रोग्रामिंग उतनी ही अधिक स्थिति है और उद्देश्य का बयान है क्योंकि यह एक तकनीक है। इसके लिए कुछ समर्पण और अतिरिक्त समय की आवश्यकता है। कुछ चीजें आप इस प्रक्रिया को कम भीषण बनाने के लिए कर सकते हैं ...

  • सभी नियमों और चेतावनियों को चालू करें सभी भाषा एक्सटेंशन
  • समय-समय पर संकलन और Windows में परीक्षण कर रहे हैं और उन्हें
  • ठीक बंद करें ही नहीं, अंत
  • प्राप्त प्रोग्रामर जो परियोजना पर Windows पसंद करती है पर
  • खुद के रूप में कुछ compilers के रूप में आप
  • चुनें कर सकते हैं एक अच्छी तरह से maintaine प्रतिबंधित घ, अच्छी तरह से समर्थित ग्राफिक्स पुस्तकालय
  • अलग मंच विशिष्ट कोड
  • एक प्रथम श्रेणी के नागरिक के रूप में
  • उपचार विंडोज

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

+4

'मानकों के बारे में अच्छी बात यह है कि आपके पास से चुनने के लिए बहुत सारे लोग हैं।' ;-) – Voo

-3

सी की तुलना में, सी ++ पोर्टेबिलिटी बेहद सीमित है, अगर पूरी तरह से अप्रत्याशित नहीं है।एक के लिए आप अपवादों को ठीक नहीं कर सकते (अच्छी तरह से आप कर सकते हैं), मानक के लिए विशेष रूप से कहते हैं कि अपरिभाषित व्यवहार है। कई डिवाइस अपवादों का समर्थन भी नहीं करते हैं। तो इसके लिए, सी ++ शून्य पोर्टेबल है। इसके अलावा यूबी को देखते हुए, यह obvioulsy शून्य-असफल उच्च-प्रदर्शन वास्तविक समय प्रणालियों के लिए नहीं है जिसमें अपवाद वर्जित हैं - अपरिभाषित व्यवहार शून्य-असफल वातावरण में कोई स्थान नहीं है। फिर वहां नाम है जो सबसे अधिक है, यदि हर नहीं, तो कंपाइलर पूरी तरह से अलग करता है। अच्छी पोर्टेबिलिटी और अंतर-संगतता बाहरी "सी" के लिए प्रतीकों को निर्यात करने के लिए उपयोग किया जाना चाहिए, फिर भी यह किसी भी और सभी नेमस्पेस जानकारी को पूरी तरह से शून्य करता है, जिसके परिणामस्वरूप डुप्लिकेट प्रतीक होते हैं। कोई भी नामस्थानों का उपयोग नहीं करना चुन सकता है और अद्वितीय प्रतीक नामों का उपयोग कर सकता है। फिर भी एक और सी ++ सुविधा शून्य प्रदान की गई। फिर भाषा की जटिलता है, जिसके परिणामस्वरूप विभिन्न आर्किटेक्चर के लिए विभिन्न कंपाइलरों में कार्यान्वयन की कठिनाइयों का परिणाम होता है। इन कठिनाइयों के कारण, वास्तविक पोर्टेबिलिटी एक समस्या बन जाती है। कोई संकलक निर्देश/# ifdefs/मैक्रोज़ की एक बड़ी श्रृंखला होने के द्वारा इसे हल कर सकता है। टेम्पलेट्स? अधिकांश कंपाइलरों द्वारा भी समर्थित नहीं है।

क्या पोर्टेबिलिटी? आपका मतलब विंडोज के लिए एमएसवीसी और लिनक्स के लिए जीसीसी जैसे कुछ मुख्य धारा निर्माण लक्ष्यों के बीच अर्द्ध पोर्टेबिलिटी है? यहां तक ​​कि, उस मुख्य-खंड खंड में, उपरोक्त सभी समस्याओं और सीमाएं मौजूद हैं। यह भी सोचने के लिए मंद है कि सी ++ पोर्टेबल है।

+1

आपके द्वारा दिए गए अधिकांश अंक पूछे गए प्रश्न से असंबंधित हैं: * "क्या मैं अलग-अलग प्लेटफॉर्म पर अनुपालन सी ++ कोड संकलित कर सकता हूं?" * और उस प्रश्न का उत्तर ** आपके द्वारा वर्णित मुद्दों में से ** ** से ग्रस्त है। आप अपवाद अक्षम नहीं कर सकते (और नहीं करेंगे), क्योंकि तब यह सी ++ नहीं होगा। नाम मैंगलिंग या तो कोई मुद्दा नहीं है। यह कंपाइलर और लिंकर के बीच एक अनुबंध है, और वे किसी दिए गए टूल श्रृंखला के लिए सहमत होंगे। टेम्पलेट समर्थन की कमी? उहम ... हाँ। वह पिछले सहस्राब्दी था। – IInspectable

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