G ++ और gcc में क्या अंतर है?


875

G ++ और gcc में क्या अंतर है? उनमें से कौन सा सामान्य सी ++ विकास के लिए इस्तेमाल किया जाना चाहिए?


g ++ => c ++ संकलक gcc => c संकलक
नागप्पा

जवाबों:


727

gccऔर g++जीएनयू कंपाइलर कलेक्शन के कंपाइलर-ड्राइवर हैं (जो कभी जीएनयू सी कंपाइलर था )।

भले ही वे स्वचालित रूप से निर्धारित cc1 cc1plusकरते हैं कि फ़ाइल-प्रकार के आधार पर कॉल करने के लिए कौन सा बैकएंड ( ...) है, जब तक कि ओवरराइड नहीं किया जाता है -x language, उनके पास कुछ अंतर हैं।

उनके डिफॉल्ट में शायद सबसे महत्वपूर्ण अंतर यह है कि वे किस लाइब्रेरी को अपने आप से जोड़ते हैं।

जीसीसी के ऑनलाइन प्रलेखन लिंक विकल्पों के अनुसार और जी ++ कैसे लागू किया जाता है , g++इसके बराबर है gcc -xc++ -lstdc++ -shared-libgcc(1 एक संकलक विकल्प है, 2 दो लिंकर विकल्प हैं)। यह -vविकल्प के साथ दोनों को चलाकर जांचा जा सकता है (यह बैकेंड टूलचैन कमांड को चलाया जा रहा है)।


13
इस उत्तर से, मैं यह निष्कर्ष निकालता हूं कि प्रभावी रूप से g ++ कमांड सिर्फ झंडे के एक गुच्छा के साथ है। फिर क्यों, लिनक्स में gcc और g ++ के लिए दो अलग-अलग बायनेरिज़ (लगभग समान आकार के) हैं? क्या हमारे पास सिर्फ एक बाइनरी और एक सिमलिंक (या उन पंक्तियों के साथ कुछ) नहीं होना चाहिए?
उचिहातचीची

9
@ युचीतलची ये फाइलें हार्ड लिंक हैं और जब इन्हें बूट किया जाता है तो वे यह देखने के argv[0]लिए जांच करते हैं कि किस इनवोकेशन का इस्तेमाल किया जाना चाहिए। यह कोर UNIX उपयोगिताओं में बहुत आम है।
स्वाद

438

जीसीसी: जीएनयू संकलक संग्रह

  • जीएनयू कंपाइलर द्वारा समर्थित सभी विभिन्न भाषाओं को संदर्भित करता है।

gcc: जीएनयू सी कंपाइलर
g++: जीएनयू सी ++ कंपाइलर

मुख्य अंतर:

  1. gccसंकलन करेगा: *.c\*.cppक्रमशः C और C ++ जैसी फाइलें।
  2. g++संकलित करेंगे: *.c\*.cppफ़ाइलें लेकिन वे सभी C ++ फ़ाइलों के रूप में मानी जाएंगी।
  3. यदि आप g++ऑब्जेक्ट फ़ाइलों को लिंक करने के लिए उपयोग करते हैं, तो यह स्वचालित रूप से std C ++ पुस्तकालयों में लिंक gccकरता है ( ऐसा नहीं करता है)।
  4. gcc संकलित सी फ़ाइलों में कम पूर्वनिर्धारित मैक्रोज़ हैं।
  5. 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

37
आप पैरामीटर gccपास करके std C ++ लाइब्रेरी को लिंक कर सकते हैं -lstdc++
डेनिल्सन साआ मिया

16
केवल मानक पुस्तकालयों की तुलना में 'जीसीसी' और 'जी ++' के बीच अधिक अंतर हैं, इसलिए gcc -lstdc++अभी भी आपको वैसा ही व्यवहार नहीं मिलेगा g++। हम एक कारण के लिए अपने स्वयं के ड्राइवर में उस भाषा-विशिष्ट व्यवहार के सभी डालते हैं, यही वह है जिसके लिए यह है। :-)
टीआई स्ट्रगा

8
मेरी टिप्पणी सिर्फ लिंकिंग के बारे में बात नहीं कर रही है ... यह बात है। यहां तक ​​कि चर्चा को केवल लिंक करने तक सीमित करना (जो आपका उत्तर नहीं था), एक उपयोगकर्ता अभी भी केवल निर्दिष्ट करके संपूर्ण C ++ मानक पुस्तकालय का उपयोग नहीं कर पाएगा -lstdc++, क्योंकि गणित, RTTI और अपवाद जानकारी पर निर्भरताएँ गायब होंगी। किसी दिए गए टेस्ट केस के लिंक या विफल होने पर ऑपरेटिंग सिस्टम पर निर्भर करेगा और C ++ की सुविधाओं का उपयोग टेस्ट केस द्वारा किया जाता है, यही कारण है कि फिर से उस सभी ज्ञान को g ++ ड्राइवर में बनाया जाता है बजाय उपयोगकर्ता को छोड़ने के लिए ।
ती स्ट्रगा

10
मेरा विश्वास करो, हमारे पास यह चर्चा बहुत है, आमतौर पर जब एक लिनक्स उपयोगकर्ता अपने अधूरे मेकफाइल को दूसरे प्लेटफॉर्म पर ले जाने की कोशिश करता है। :-) g ++ लिंक चरण gcc -lstdc++अन्य OSes की तुलना में बहुत अधिक करता है , खासकर जब लक्ष्य एक एम्बेडेड प्लेटफॉर्म है। सौभाग्य से, यही कारण है कि हम पहली जगह में जी ++ शिप करते हैं।
Ti Strga

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

82

C ++ के लिए आपको g ++ का उपयोग करना चाहिए।

यह एक ही संकलक है (उदाहरण के लिए जीएनयू संकलक संग्रह)। जीसीसी या जी ++ केवल अलग-अलग डिफ़ॉल्ट विकल्पों के साथ एक अलग फ्रंट-एंड चुनते हैं।

संक्षेप में: यदि आप g ++ का उपयोग करते हैं, तो फ्रंटेंड लिंकर को बताएगा कि आप C ++ मानक पुस्तकालयों के साथ लिंक करना चाहते हैं। जीसीसी फ्रंटेंड ऐसा नहीं करेगा (यदि आप सही कमांड लाइन विकल्प पास करते हैं तो यह उनके साथ लिंक भी कर सकता है)।


3
+1 इसके अलावा मेरा GNU / लिनक्स gcc मैन पेज कहता है, "जब आप C ++ प्रोग्राम्स को संकलित करते हैं, तो आपको GCC को g ++ के रूप में आमंत्रित करना चाहिए।"
अण्डाकार दृश्य

35

बीच क्या अंतर है g++और gcc?

gccएक एकल भाषा "GNU C कंपाइलर" से एक बहु-भाषा "GNU कंपाइलर कलेक्शन" विकसित हुआ है। "GNU C कंपाइलर" शब्द का उपयोग अभी भी कभी-कभी C प्रोग्रामिंग के संदर्भ में किया जाता है।

g++ है GNU संकलन संग्रह के लिए सी ++ संकलक। जैसे gnatके लिए Ada कंपाइलर है gccGNU संकलक संग्रह (GCC) का उपयोग करना देखें

उदाहरण के लिए, Ubuntu 16.04 और 18.04 man g++कमांड GCC(1)मैनुअल पेज को वापस करता है ।

Ubuntu 16.04 और 18.04 में man gccकहा गया है कि ...

g++ के रूप में ज्यादातर एक ही विकल्प स्वीकार करता है gcc

और वह डिफ़ॉल्ट ...

... का उपयोग gccC ++ लाइब्रेरी को नहीं जोड़ता है। 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 को आमंत्रित करना चाहिए ।


21

एक उल्लेखनीय अंतर यह है कि यदि आप एक .cफ़ाइल को पास करने के लिए इसे सी के रूप में संकलित करेंगे।

जी ++ का डिफ़ॉल्ट व्यवहार .cसी ++ (जब तक -x cनिर्दिष्ट नहीं है) के रूप में फ़ाइलों का इलाज करना है।


19
(देर से, लेकिन पोस्टीरिटी के लिए,) जैसा कि अन्य उत्तरों ने बताया है, यह किसी भी तरह से "एकमात्र उल्लेखनीय अंतर" नहीं है, जब तक कि पाठक की उल्लेखनीयता की तिरछी परिभाषा न हो।
अंडरस्कोर_ड

16

हालांकि gcc और g ++ कमांड बहुत समान चीजें करते हैं, g ++ को कमांड के रूप में बनाया गया है जिसे आप C ++ प्रोग्राम को संकलित करने के लिए आमंत्रित करेंगे; यह स्वचालित रूप से सही काम करने का इरादा है।

पर्दे के पीछे, वे वास्तव में एक ही कार्यक्रम हैं। जैसा कि मैं समझता हूं, दोनों तय करते हैं कि फ़ाइल एक्सटेंशन के आधार पर किसी प्रोग्राम को C या C ++ के रूप में संकलित किया जाए या नहीं। दोनों सी ++ मानक पुस्तकालय के खिलाफ लिंक करने में सक्षम हैं, लेकिन केवल जी ++ डिफ़ॉल्ट रूप से ऐसा करता है। इसलिए यदि आपके पास C ++ में लिखा हुआ कोई प्रोग्राम है जो मानक पुस्तकालय के खिलाफ लिंक करने की आवश्यकता नहीं है, तो जीसीसी सही काम करने के लिए होगा; लेकिन फिर, तो g ++ होगा। इसलिए सामान्य सी ++ विकास के लिए जी ++ का उपयोग न करने का वास्तव में कोई कारण नहीं है।


12

मुझे इस मुद्दे पर दिलचस्पी हुई और कुछ प्रयोग किए

  1. मुझे वह वर्णन यहाँ मिला , लेकिन यह बहुत छोटा है।

  2. फिर मैंने 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
  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
  4. लेकिन जब मैं उस शैली में "गन्न संकलक संग्रह" उपकरण चलाने की कोशिश करता हूं:

    $ 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]
  5. लेकिन यह अभी भी बिना किसी त्रुटि के साथ काम करता है

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. और यह भी

    $ 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;
}

जाँच - परिणाम:

  1. अगर प्रोसेस ट्री को देखें तो ऐसा लगता है कि gcc, और g ++ अन्य टूल्स के लिए बैकएंड है, जो मेरे वातावरण में हैं: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe

  2. यदि आपके पास सही एक्सटेंशन है या सही -std -x झंडे सेट करते हैं तो gcc मेटाटूल के रूप में ठीक काम करता है। देखें इस


9

"जीसीसी" जीएनयू कम्पाइलर संग्रह के लिए एक सामान्य शॉर्टहैंड शब्द है। यह संकलक के लिए सबसे सामान्य नाम है, और नाम का उपयोग तब होता है जब जोर सी कार्यक्रमों को संकलित करने पर होता है (जैसा कि संक्षेप में पहले "ग्नू सी कंपाइलर" के लिए खड़ा था)।

C ++ संकलन का जिक्र करते समय, संकलक को "G ++" कहना सामान्य है। चूंकि केवल एक संकलक है, इसलिए इसे "जीसीसी" कहना भी सटीक है, चाहे भाषा का संदर्भ कोई भी हो; हालाँकि, C ++ प्रोग्राम्स पर जोर देने पर "G ++" शब्द अधिक उपयोगी है।

आप यहाँ और पढ़ सकते हैं ।


0

मैं एक 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 ++ चुनना बेहतर विकल्प है।


1. भाषा का चयन करें 2. libstdc ++ में कुछ पुस्तकालय suhch चुनें: आप दो काम करना है
PersianGulf

-1

gcc और g ++ दोनों GNU कंपाइलर हैं। वे दोनों c और c ++ को संकलित करते हैं। अंतर * .c फाइलों के लिए है। gcc इसे एसी प्रोग्राम के रूप में मानता है और जी ++ इसे एसी ++ प्रोग्राम के रूप में देखता है। * .cpp फ़ाइलों को c ++ प्रोग्राम माना जाता है। c ++ c का एक सुपर सेट है और वाक्य रचना अधिक सख्त है, इसलिए प्रत्यय के बारे में सावधान रहें।


1
C ++ एक अलग भाषा है, C का एक कठोर सुपरसेट नहीं है, इसलिए गलत लक्ष्य भाषा के साथ संकलन करने से अप्रत्याशित परिणाम प्राप्त हो सकते हैं। यह भी ध्यान दें कि एक सी ++ के रूप में g++भी व्याख्या करेगा .cc- केवल फ़ाइल नाम विस्तार।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.