G ++ और gcc में क्या अंतर है? उनमें से कौन सा सामान्य सी ++ विकास के लिए इस्तेमाल किया जाना चाहिए?
G ++ और gcc में क्या अंतर है? उनमें से कौन सा सामान्य सी ++ विकास के लिए इस्तेमाल किया जाना चाहिए?
जवाबों:
gcc
और g++
जीएनयू कंपाइलर कलेक्शन के कंपाइलर-ड्राइवर हैं (जो कभी जीएनयू सी कंपाइलर था )।
भले ही वे स्वचालित रूप से निर्धारित cc1
cc1plus
करते हैं कि फ़ाइल-प्रकार के आधार पर कॉल करने के लिए कौन सा बैकएंड ( ...) है, जब तक कि ओवरराइड नहीं किया जाता है -x language
, उनके पास कुछ अंतर हैं।
उनके डिफॉल्ट में शायद सबसे महत्वपूर्ण अंतर यह है कि वे किस लाइब्रेरी को अपने आप से जोड़ते हैं।
जीसीसी के ऑनलाइन प्रलेखन लिंक विकल्पों के अनुसार और जी ++ कैसे लागू किया जाता है , g++
इसके बराबर है gcc -xc++ -lstdc++ -shared-libgcc
(1 एक संकलक विकल्प है, 2 दो लिंकर विकल्प हैं)। यह -v
विकल्प के साथ दोनों को चलाकर जांचा जा सकता है (यह बैकेंड टूलचैन कमांड को चलाया जा रहा है)।
argv[0]
लिए जांच करते हैं कि किस इनवोकेशन का इस्तेमाल किया जाना चाहिए। यह कोर UNIX उपयोगिताओं में बहुत आम है।
जीसीसी: जीएनयू संकलक संग्रह
gcc
: जीएनयू सी कंपाइलर
g++
: जीएनयू सी ++ कंपाइलर
मुख्य अंतर:
gcc
संकलन करेगा: *.c\*.cpp
क्रमशः C और C ++ जैसी फाइलें।g++
संकलित करेंगे: *.c\*.cpp
फ़ाइलें लेकिन वे सभी C ++ फ़ाइलों के रूप में मानी जाएंगी।g++
ऑब्जेक्ट फ़ाइलों को लिंक करने के लिए उपयोग करते हैं, तो यह स्वचालित रूप से std C ++ पुस्तकालयों में लिंक gcc
करता है ( ऐसा नहीं करता है)।gcc
संकलित सी फ़ाइलों में कम पूर्वनिर्धारित मैक्रोज़ हैं।gcc
फ़ाइलों को संकलित *.cpp
और g++
संकलित *.c\*.cpp
करने के लिए कुछ अतिरिक्त मैक्रो हैं।*.cpp
फ़ाइलों को संकलित करते समय अतिरिक्त मैक्रो :
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
पास करके std C ++ लाइब्रेरी को लिंक कर सकते हैं -lstdc++
।
gcc -lstdc++
अभी भी आपको वैसा ही व्यवहार नहीं मिलेगा g++
। हम एक कारण के लिए अपने स्वयं के ड्राइवर में उस भाषा-विशिष्ट व्यवहार के सभी डालते हैं, यही वह है जिसके लिए यह है। :-)
-lstdc++
, क्योंकि गणित, RTTI और अपवाद जानकारी पर निर्भरताएँ गायब होंगी। किसी दिए गए टेस्ट केस के लिंक या विफल होने पर ऑपरेटिंग सिस्टम पर निर्भर करेगा और C ++ की सुविधाओं का उपयोग टेस्ट केस द्वारा किया जाता है, यही कारण है कि फिर से उस सभी ज्ञान को g ++ ड्राइवर में बनाया जाता है बजाय उपयोगकर्ता को छोड़ने के लिए ।
gcc -lstdc++
अन्य OSes की तुलना में बहुत अधिक करता है , खासकर जब लक्ष्य एक एम्बेडेड प्लेटफॉर्म है। सौभाग्य से, यही कारण है कि हम पहली जगह में जी ++ शिप करते हैं।
-dumpspec
(उदाहरण के लिए) एक क्रॉस कंपाइलर पर एम्बेडेड सिस्टम को लक्षित करते हैं, तो आप अंतर देखेंगे। बस लिंकर के अंतर से अधिक हैं ... जो फिर से, आपके उत्तर के बारे में था (प्रीप्रोसेसर मैक्रोज़, पथ, एकाधिक रनटाइम लाइब्रेरी शामिल हैं)। हम एक-दूसरे से बात करते दिख रहे हैं, लेकिन एक पूर्व जीसीसी अनुरक्षक के रूप में, मैं आपको विश्वास दिलाता हूं कि जो भी सामने हैं, उनसे मैं परिचित हूं।
C ++ के लिए आपको g ++ का उपयोग करना चाहिए।
यह एक ही संकलक है (उदाहरण के लिए जीएनयू संकलक संग्रह)। जीसीसी या जी ++ केवल अलग-अलग डिफ़ॉल्ट विकल्पों के साथ एक अलग फ्रंट-एंड चुनते हैं।
संक्षेप में: यदि आप g ++ का उपयोग करते हैं, तो फ्रंटेंड लिंकर को बताएगा कि आप C ++ मानक पुस्तकालयों के साथ लिंक करना चाहते हैं। जीसीसी फ्रंटेंड ऐसा नहीं करेगा (यदि आप सही कमांड लाइन विकल्प पास करते हैं तो यह उनके साथ लिंक भी कर सकता है)।
बीच क्या अंतर है g++
और gcc
?
gcc
एक एकल भाषा "GNU C कंपाइलर" से एक बहु-भाषा "GNU कंपाइलर कलेक्शन" विकसित हुआ है। "GNU C कंपाइलर" शब्द का उपयोग अभी भी कभी-कभी C प्रोग्रामिंग के संदर्भ में किया जाता है।
g++
है GNU संकलन संग्रह के लिए सी ++ संकलक। जैसे gnat
के लिए Ada कंपाइलर है gcc
। GNU संकलक संग्रह (GCC) का उपयोग करना देखें
उदाहरण के लिए, Ubuntu 16.04 और 18.04 man g++
कमांड GCC(1)
मैनुअल पेज को वापस करता है ।
Ubuntu 16.04 और 18.04 में man gcc
कहा गया है कि ...
g++
के रूप में ज्यादातर एक ही विकल्प स्वीकार करता हैgcc
और वह डिफ़ॉल्ट ...
... का उपयोग
gcc
C ++ लाइब्रेरी को नहीं जोड़ता है।g++
एक ऐसा प्रोग्राम है जो GCC को कॉल करता है और C ++ लाइब्रेरी के खिलाफ स्वचालित रूप से लिंक करने को निर्दिष्ट करता है। जब तक -x का उपयोग नहीं किया जाता है, यह C स्रोत फ़ाइलों के बजाय C ++ स्रोत फ़ाइलों के रूप में .c, .h और .i फ़ाइलों का व्यवहार करता है। C ++ संकलनों में उपयोग के लिए .h एक्सटेंशन के साथ C हेडर फ़ाइल को प्री-कोड करते समय यह प्रोग्राम भी उपयोगी है।
खोजें gcc
अधिक जानकारी के लिए आदमी पृष्ठों पर विकल्प के बीच प्रसरण gcc
और g++
।
सामान्य सी ++ विकास के लिए किसका उपयोग किया जाना चाहिए?
तकनीकी रूप से, या तो gcc
या g++
लागू विकल्प सेटिंग्स के साथ सामान्य C ++ विकास के लिए इस्तेमाल किया जा सकता है। हालाँकि, g++
डिफ़ॉल्ट व्यवहार स्वाभाविक रूप से C ++ विकास से जुड़ा होता है।
उबंटू 18.04 आदमी पेज निम्नलिखित पैरा कहा:
जीसीसी को चलाने का सामान्य तरीका निष्पादन योग्य कहा जाता है
gcc
, याmachine-gcc
जब क्रॉस-संकलन, याmachine-gcc-version
जीसीसी का एक विशिष्ट संस्करण चलाना है। जब आप C ++ प्रोग्राम संकलित करते हैं, तो आपकोg++
इसके बजाय GCC को आमंत्रित करना चाहिए ।
एक उल्लेखनीय अंतर यह है कि यदि आप एक .c
फ़ाइल को पास करने के लिए इसे सी के रूप में संकलित करेंगे।
जी ++ का डिफ़ॉल्ट व्यवहार .c
सी ++ (जब तक -x c
निर्दिष्ट नहीं है) के रूप में फ़ाइलों का इलाज करना है।
हालांकि gcc और g ++ कमांड बहुत समान चीजें करते हैं, g ++ को कमांड के रूप में बनाया गया है जिसे आप C ++ प्रोग्राम को संकलित करने के लिए आमंत्रित करेंगे; यह स्वचालित रूप से सही काम करने का इरादा है।
पर्दे के पीछे, वे वास्तव में एक ही कार्यक्रम हैं। जैसा कि मैं समझता हूं, दोनों तय करते हैं कि फ़ाइल एक्सटेंशन के आधार पर किसी प्रोग्राम को C या C ++ के रूप में संकलित किया जाए या नहीं। दोनों सी ++ मानक पुस्तकालय के खिलाफ लिंक करने में सक्षम हैं, लेकिन केवल जी ++ डिफ़ॉल्ट रूप से ऐसा करता है। इसलिए यदि आपके पास C ++ में लिखा हुआ कोई प्रोग्राम है जो मानक पुस्तकालय के खिलाफ लिंक करने की आवश्यकता नहीं है, तो जीसीसी सही काम करने के लिए होगा; लेकिन फिर, तो g ++ होगा। इसलिए सामान्य सी ++ विकास के लिए जी ++ का उपयोग न करने का वास्तव में कोई कारण नहीं है।
मुझे इस मुद्दे पर दिलचस्पी हुई और कुछ प्रयोग किए
मुझे वह वर्णन यहाँ मिला , लेकिन यह बहुत छोटा है।
फिर मैंने gcc.exe और g ++ के साथ प्रयोग करने का प्रयास किया। अपनी विंडोज़ मशीन पर exe।:
$ g++ --version | head -n1
g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
$ gcc --version | head -n1
gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
मैंने c89, c99 और c ++ 1998 की सरल परीक्षण फ़ाइलों को संकलित करने की कोशिश की और यह मेरे लिए सही एक्सटेंशन के साथ अच्छी तरह से काम करता है जो भाषा से मेल खाते हैं
gcc -std=c99 test_c99.c
gcc -std=c89 test_c89.c
g++ -std=c++98 test_cpp.cpp
gcc -std=c++98 test_cpp.cpp
लेकिन जब मैं उस शैली में "गन्न संकलक संग्रह" उपकरण चलाने की कोशिश करता हूं:
$ gcc -std=c++98 test_cpp.c
cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
लेकिन यह अभी भी बिना किसी त्रुटि के साथ काम करता है
$ gcc -x c++ -std=c++98 test_cpp.c
और यह भी
$ g++ -std=c++0x test_cpp_11.cpp
ps टेस्ट फाइलें
$ cat test_c89.c test_c99.c test_cpp.cpp
// C89 compatible file
int main()
{
int x[] = {0, 2};
return sizeof(x);
}
// C99 compatible file
int main()
{
int x[] = {[1]=2};
return sizeof(x);
}
// C++1998,2003 compatible file
class X{};
int main()
{
X x;
return sizeof(x);
}
// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
std::vector<int> a {1,2,3}; // bracket initialization
return 0;
}
जाँच - परिणाम:
अगर प्रोसेस ट्री को देखें तो ऐसा लगता है कि gcc, और g ++ अन्य टूल्स के लिए बैकएंड है, जो मेरे वातावरण में हैं: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe
यदि आपके पास सही एक्सटेंशन है या सही -std -x झंडे सेट करते हैं तो gcc मेटाटूल के रूप में ठीक काम करता है। देखें इस
"जीसीसी" जीएनयू कम्पाइलर संग्रह के लिए एक सामान्य शॉर्टहैंड शब्द है। यह संकलक के लिए सबसे सामान्य नाम है, और नाम का उपयोग तब होता है जब जोर सी कार्यक्रमों को संकलित करने पर होता है (जैसा कि संक्षेप में पहले "ग्नू सी कंपाइलर" के लिए खड़ा था)।
C ++ संकलन का जिक्र करते समय, संकलक को "G ++" कहना सामान्य है। चूंकि केवल एक संकलक है, इसलिए इसे "जीसीसी" कहना भी सटीक है, चाहे भाषा का संदर्भ कोई भी हो; हालाँकि, C ++ प्रोग्राम्स पर जोर देने पर "G ++" शब्द अधिक उपयोगी है।
आप यहाँ और पढ़ सकते हैं ।
मैं एक Linux सिस्टम में gcc और g ++ का परीक्षण कर रहा था। MAKEFILE का उपयोग करके, मैं "GNU मेक" द्वारा उपयोग किए जाने वाले कंपाइलर को परिभाषित कर सकता हूं। मैंने "C plus plus" के तथाकथित "डायनामिक मेमोरी" लोकेटिंग फीचर के साथ परीक्षण किया:
int main(){
int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}
केवल g ++ मेरे कंप्यूटर पर सफलतापूर्वक संकलन कर सकता है जबकि gcc त्रुटि की सूचना देगा
undefined reference to `operator new(unsigned long)'
इसलिए मेरा अपना निष्कर्ष है कि "सी प्लस प्लस" का पूरी तरह से समर्थन नहीं है। ऐसा लगता है कि C ++ स्रोत फ़ाइलों के लिए g ++ चुनना बेहतर विकल्प है।
gcc और g ++ दोनों GNU कंपाइलर हैं। वे दोनों c और c ++ को संकलित करते हैं। अंतर * .c फाइलों के लिए है। gcc इसे एसी प्रोग्राम के रूप में मानता है और जी ++ इसे एसी ++ प्रोग्राम के रूप में देखता है। * .cpp फ़ाइलों को c ++ प्रोग्राम माना जाता है। c ++ c का एक सुपर सेट है और वाक्य रचना अधिक सख्त है, इसलिए प्रत्यय के बारे में सावधान रहें।
g++
भी व्याख्या करेगा .cc
- केवल फ़ाइल नाम विस्तार।