Gcc के साथ C ++ प्रोग्राम का संकलन


84

प्रश्न: gcc कंपाइलर के साथ C ++ प्रोग्राम कैसे संकलित करें?

पंक्तियों की संख्या:

#include<iostream>
using std::cout;
using std::endl;
int main()
{
   #ifdef __cplusplus
   cout << "C++ compiler in use and version is " << __cplusplus << endl;
   #endif
   cout <<"Version is " << __STDC_VERSION__ << endl;
   cout << "Hi" << __FILE__ << __LINE__ << endl;
}

और जब मैं संकलन करने की कोशिश करता हूं info.c

$ gcc info.C

Undefined                       first referenced
 symbol                             in file
cout                                /var/tmp/ccPxLN2a.o
endl(ostream &)                     /var/tmp/ccPxLN2a.o
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o
ostream::operator<<(int)            /var/tmp/ccPxLN2a.o
ostream::operator<<(long)           /var/tmp/ccPxLN2a.o
ostream::operator<<(char const *)   /var/tmp/ccPxLN2a.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status

क्या C ++ प्रोग्राम्स को कंपाइल करने में सक्षम नहीं है? संबंधित नोट पर, gcc और g ++ के बीच क्या अंतर है। धन्यवाद,


जवाबों:


136

जीसीसी वास्तव में ठीक सी + + कोड संकलन कर सकता है। आपके द्वारा प्राप्त की गई त्रुटियां लिंकर त्रुटियां हैं, संकलक त्रुटियां नहीं।

ऑड्स यह है कि यदि आप संकलन लाइन को इस प्रकार बदलते हैं:

gcc info.C -lstdc++

जो इसे मानक c ++ लाइब्रेरी से लिंक करता है, तो यह ठीक काम करेगा।

हालाँकि, आपको अपने जीवन को आसान बनाना चाहिए और g ++ का उपयोग करना चाहिए।


संपादित करें:

रूप ने अपनी टिप्पणी में एक और उत्तर के लिए इसे सर्वश्रेष्ठ कहा :

[...] gcc फ़ाइल एक्सटेंशन के आधार पर सही बैक-एंड कंपाइलर का चयन करेगा (यानी एक .c को C और C ++ के रूप में संकलित करेगा) और बायनेरिज़ को केवल मानक C और GCC हेल्पर पुस्तकालयों के खिलाफ डिफ़ॉल्ट रूप से परवाह किए बिना लिंक करता है। इनपुट भाषाएँ; g ++ एक्सटेंशन के आधार पर सही बैक-एंड का भी चयन करेगा, सिवाय इसके कि मुझे लगता है कि यह सभी C स्रोत को C ++ के बजाय संकलित करता है (अर्थात यह दोनों .c और .cc को C ++ के रूप में संकलित करता है) और इसमें इनपुट भाषाओं की परवाह किए बिना इसके लिंक चरण में libstdc ++ शामिल है।


41

यदि आप कोड को .c एक्सटेंशन देते हैं तो कंपाइलर को लगता है कि यह C कोड है, C ++ नहीं। और C ++ कंपाइलर ड्राइवर को g ++ कहा जाता है, यदि आप gcc ड्राइवर का उपयोग करते हैं तो आपको लिंकर की समस्या होगी, क्योंकि मानक C ++ लाइब्रेरीज़ डिफ़ॉल्ट रूप से लिंक नहीं होंगी। इसलिए आप यह चाहते हैं:

g++ myprog.cpp

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


@ नील: मैं जो बता सकता हूं, उससे एक .C(राजधानी) एक्सटेंशन को c ++ एक्सटेंशन माना जाता है । निम्नलिखित ठीक काम करता है: gcc test.C -lstdc++ -o testया g++ test.C -o test
इवान टेरान

3
@ इवान हाँ, निश्चित रूप से यह करता है। इसका मतलब यह नहीं है कि आपको कभी भी इसका उपयोग करना चाहिए, क्योंकि यह भयानक पोर्टेबिलिटी समस्याओं का कारण होगा, जैसा कि सभी केस-संवेदी फ़ाइल नाम करते हैं। C ++ फ़ाइलों के लिए एक्सटेंशन हमेशा .cpp होना चाहिए। यह कोई समस्या नहीं है, और सभी सामान्य ऑपरेटिंग सिस्टम पर काम करने की गारंटी है।


12

डिफ़ॉल्ट रूप से, जीसीसी फ़ाइल एक्सटेंशन के आधार पर भाषा का चयन करता है, लेकिन आप जीसीसी को इस तरह -x विकल्प के साथ एक अलग भाषा बैकएंड का चयन करने के लिए मजबूर कर सकते हैं:

gcc -x c++

"विकल्प आउटपुट के प्रकार को नियंत्रित करने" के तहत gcc मैन पेज में अधिक विकल्प विस्तृत हैं। उदाहरण के लिए देखें http://linux.die.net/man/1/gcc (पाठ के लिए पृष्ठ पर खोजें -x language)।

यह सुविधा उन मामलों में बहुत उपयोगी है जहाँ gcc एक फ़ाइल एक्सटेंशन का उपयोग करके भाषा का अनुमान नहीं लगा सकता है, उदाहरण के लिए यदि आप कोड उत्पन्न कर रहे हैं और इसे stdin के माध्यम से gcc को खिला रहे हैं।


11

Gcc और g ++ के बीच का अंतर हैं:

     gcc            |        g++
compiles c source   |   compiles c++ source

g ++ के बजाय g ++ का उपयोग करके आपको c ++ स्रोत संकलित करें।


16
यह उससे कहीं अधिक जटिल है, जैसा कि अन्य उत्तरों में है। gcc फ़ाइल एक्सटेंशन के आधार पर सही बैक-एंड कंपाइलर का चयन करेगा (अर्थात, C को। C के रूप में और C ++ के रूप में संकलित करेगा) और बायनेरी को इनपुट भाषाओं की परवाह किए बिना केवल मानक C और GCC हेल्पर पुस्तकालयों के विरुद्ध लिंक करता है; g ++ एक्सटेंशन के आधार पर सही बैक-एंड का भी चयन करेगा, सिवाय इसके कि मुझे लगता है कि यह सभी C स्रोत को C ++ के बजाय संकलित करता है (अर्थात यह दोनों .c और .cc को C ++ के रूप में संकलित करता है) और इसमें इनपुट भाषाओं की परवाह किए बिना इसके लिंक चरण में libstdc ++ शामिल है।
Rup

1
@ रिप: सही, यह मूल रूप से है जो मैं अपने जवाब में कह रहा था।
इवान टेरान

1

अगर मुझे सही तरीके से याद है, तो जीसीसी प्रत्यय से फिलाटाइप को निर्धारित करता है। तो, यह foo.cc करें और इसे काम करना चाहिए।

और, अपने अन्य सवाल का जवाब देने, कि "जीसीसी" और "जी ++" के बीच अंतर है। gcc एक फ्रंटएंड है जो सही कंपाइलर चुनता है।


1

इसने मेरे लिए अच्छा काम किया। Cmd में सिर्फ एक लाइन कोड।

सबसे पहले, पुष्टि करें कि आपने जीसीसी (सी के लिए) या जी ++ (सी ++ के लिए) संकलक स्थापित किया है।

Gcc प्रकार के लिए cmd में:

जीसीसी - विसर्जन

सेमी में g ++ प्रकार के लिए:

जी ++ --version

यदि यह स्थापित है तो आगे बढ़ें।

अब, अपने .c या .cpp को cmd का उपयोग करके संकलित करें

के लिए वाक्य रचना:

gcc -o exe_filename yourfilename.c

उदाहरण:

gcc -o myfile myfile.c

यहाँ exe_filename (उदाहरण में myfile) आपकी .exe फ़ाइल का नाम है जिसे आप संकलन के बाद बनाना चाहते हैं (नोट: मैंने यहां कोई एक्सटेंशन नहीं डाला है)। और yourfilename.c (उदाहरण में myfile.c) है अपने स्रोत फ़ाइल जो .c एक्सटेंशन है।

अब अपने .c फ़ाइल वाले फ़ोल्डर पर जाएँ, यहाँ आपको .exe एक्सटेंशन वाली फ़ाइल मिलेगी। बस इसे खोलो। हुर्रे ..

के लिए सीपीपी वाक्य रचना:

g ++ -o exe_filename yourfilename.cpp

इसके बाद प्रक्रिया .c के लिए समान है।


2
सवाल था "कैसे जीसी संकलक के साथ सी ++ प्रोग्राम संकलित किया जाए?" नहीं "gcc कंपाइलर के साथ C प्रोग्राम कैसे संकलित करें? या G ++ कंपाइलर के साथ C ++ प्रोग्राम कैसे संकलित करें?"
DevX

अच्छा पकड़ा! @ डेवएक्स
राजकुमार बंसल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.