2010-07-05 19 views
40

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

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

#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 

संकलित करने के लिए कोशिश जीसीसी संकलक सी ++ कार्यक्रमों संकलन करने में सक्षम नहीं है? संबंधित नोट पर, जीसीसी और जी ++ के बीच क्या अंतर है। धन्यवाद,

+0

संभावित डुप्लिकेट [जी ++ और जीसीसी के बीच क्या अंतर है?] (Https://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc) –

उत्तर

77

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

बाधाओं यदि आप संकलन लाइन बदलने के इस होना करने के लिए है कि कर रहे हैं:

gcc info.C -lstdc++ 

जो यह मानक C++ पुस्तकालय से लिंक करता है, तो यह ठीक काम करेंगे।

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


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

Ruphis comment में यह सबसे अच्छा कहते हैं एक और जवाब देने के लिए:

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

15

के बजाय g++ का उपयोग करें।

1

यदि मुझे सही याद है, तो gcc प्रत्यय से फ़ाइल प्रकार निर्धारित करता है। तो, इसे foo.cc बनाओ और इसे काम करना चाहिए।

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

29

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

g++ myprog.cpp 

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

+0

@Neil: जो मैं बता सकता हूं, जीसीसी एक सी ++ एक्सटेंशन को 'सी' (पूंजी) एक्सटेंशन पर विचार करता है। निम्नलिखित ठीक काम करता है: 'gcc test.C -lstdC++ -o test' या' g ++ test.C -o test'। –

+2

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

4

++ हैं जीसीसी और जी के बीच का अंतर:

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

उपयोग छ ++ जीसीसी के बजाय संकलित करने के लिए आप सी स्रोत ++।

+11

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

+0

@Rup: सही, यह मूल रूप से मैं अपने उत्तर में क्या कह रहा था। –

2

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

gcc -x c++ 

और विकल्प के तहत जीसीसी आदमी पृष्ठ में भी विस्तृत कर रहे हैं। उदाहरण देखें http://linux.die.net/man/1/gcc

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

2

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

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

जीसीसी प्रकार के लिए cmd में:

जीसीसी --version

जी के लिए cmd में ++ के प्रकार:

जी ++ --version

यह स्थापित किया गया है, तो आगे बढ़ना ।

जीसीसी -ओ exe_filename yourfilename.c

उदाहरण::

अब, ग के लिए वाक्य रचना cmd

का उपयोग कर अपने ग या सीपीपी संकलन gcc -o myfile myfile.c

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

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

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

जी ++ -ओ exe_filename yourfilename.cpp

यह करने के बाद प्रक्रिया ग के लिए के रूप में ही है।