2009-11-08 17 views
26

मैं "avishay.cpp" नामक एक फाइल में & a previous question से नीचे कोड चिपकाया में कटौती और फिरउबंटू लिनक्स के तहत सी ++ को संकलित कैसे करें?

gcc avishay.cpp 

दौड़ा केवल लिंकर से निम्न त्रुटि संदेश मिलता है। क्या गलत हुआ, मुझे क्या करना चाहिए?

[email protected]:~/Projects/StackOverflow$ gcc -static avishay.cpp 
/tmp/cccRNW34.o: In function `__static_initialization_and_destruction_0(int, int)': 
avishay.cpp:(.text+0x41): undefined reference to `std::ios_base::Init::Init()' 
avishay.cpp:(.text+0x46): undefined reference to `std::ios_base::Init::~Init()' 
/tmp/cccRNW34.o: In function `A::func()': 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x11): undefined reference to `std::cout' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x16): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x1e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x26): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x36): undefined reference to `std::cout' 
avishay.cpp:(.text._ZN1A4funcEv[A::func()]+0x3b): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(int)' 
/tmp/cccRNW34.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' 
collect2: ld returned 1 exit status 

सी ++ कोड (नहीं मेरे कोड, मैं सिर्फ इसे चलाने के लिए कोशिश कर रहा था):

#include <iostream> 
using namespace std; 

class A 
{ 
private: 
    int _dmember; 

public: 
    void func() 
    { 
    cout<<"Inside A!! "<<endl; 
    cout<<_dmember; // crash when reach here. 
    } 
}; 

int main() 

{ 

    A* a= NULL; 

    a->func(); // prints "Inside A!!!" 

    return 1; 
} 
+0

http://stackoverflow.com/q/203548/981959 –

उत्तर

67

आप g++, नहीं gcc का उपयोग करना चाहिए, सी ++ कार्यक्रमों संकलित करने के लिए।

इस विशेष कार्यक्रम के लिए, मैं सिर्फ

make avishay 

टाइप किया और make आंकड़ा बाकी बाहर निकलने दिया। आपके निष्पादन योग्य को a.out की बजाय, एक सभ्य नाम भी देता है।

+3

का डुप्लिकेट मेरे बारे में कितना बेवकूफ है! आपका बहुत बहुत धन्यवाद। –

+5

"मेक" टिप के लिए एक और +1 (अगर मैं कर सकता था)। मैं कभी नहीं जानता था कि ऐसा कर सकता/कर सकता था! बनाने के लिए –

+1

+1! <3 –

11

आपको शायद जीसीसी की बजाय जी ++ का उपयोग करना चाहिए।

+7

धन्यवाद। कल कल मुझे नहीं पता था कि "सी ++ प्रोग्रामर" कैसे वर्तनी करें और आज मैं एक हूं! –

4

जी ++ लिनक्स के तहत सी ++ कंपाइलर है। कोड सही दिखता है। यह संभव है कि आप किसी लाइब्रेरी संदर्भ है जो इस तरह के रूप में प्रयोग किया जाता है याद कर रहे हैं:

जी ++ -l codefile.cpp

2

जी उपयोग ++ {यहाँ पुस्तकालय का नाम (गणित FNS "एम" का उपयोग करें)}। और सुनिश्चित करें कि आपके पास प्रासंगिक पुस्तकालय स्थापित हैं।

+0

मैंने उबंटू के लिए अच्छा पैसा दिया ... ओह रुको, मैंने नहीं किया! लेकिन हाँ, यह पता चला कि समस्या यह थी कि मैंने कंपाइलर को कैसे बुलाया। –

9

हां, संकलन करने के लिए g ++ का उपयोग करें। यह स्वचालित रूप से libstdC++ के सभी संदर्भ जोड़ देगा जो प्रोग्राम को लिंक करने के लिए आवश्यक हैं।

g++ source.cpp -o source 

आप -o पैरामीटर छोड़ देते हैं, तो उसके एवज में निष्पादन a.out नाम दिया जाएगा। किसी भी मामले में, निष्पादन योग्य अनुमतियों को पहले ही सेट कर दिया गया है, इसलिए chmod कुछ भी करने की आवश्यकता नहीं है।

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

+0

हाँ, कोड एक और प्रश्न (लिंक) का हिस्सा था और उसे वहां थका हुआ था। बस एक त्वरित परीक्षण के लिए, मैं नहीं करता इस कार्यक्रम को a.out कहा जा रहा है, और मुझे पता था- मेरी मुख्य समस्या संकलक नाम के साथ थी, धन्यवाद ! –

4

उपयोग

जी ++

अंतरिक्ष कार्यक्रम नाम और उसके बाद। उदाहरण के लिए:

g++ prog.cpp

यदि फ़ाइल नाम इस मामले में था, "prog.cpp"। यदि आप इस कार्यक्रम लिखने चलाना चाहते हैं:

./prog 

तो मैं

"prog"

इस्तेमाल किया है क्योंकि यह मेरी फ़ाइल नाम था।

+1

आउटपुट फ़ाइल "a.out" होगी जबतक कि आप '-o' ध्वज – Kookerus

4

यहां तक ​​कि आप अपने सी ++ कोड को जीसीसी द्वारा संकलित कर सकते हैं मजाकिया लगता है ?? हाँ यही है। यह

$ gcc avishay.cpp -lstdc++ 

का आनंद

5

अद्यतन की कोशिश अपने apt-get:

$ sudo apt-get update 
$ sudo apt-get install g++ 

अपने program.cpp चलाएँ:

$ g++ program.cpp 
$ ./a.out 
+0

का उपयोग अन्य उत्तरों में से नहीं करते हैं, यह एक और स्पष्ट और बिंदु है। बहुत बहुत धन्यवाद । – harrypotter0

0

जीसीसी स्थापित करें और नीचे दिए गए वीडियो की कोशिश करो।
इसे आजमाएं:
https://www.youtube.com/watch?v=A6v2Ceqy4Tk
आशा है कि यह आपके लिए काम करेगा।

1

आप उपयोग कर सकते हैं जी ++ --std = C++ 0x example.cpp -ओ उदाहरण

1

source.cpp संकलन करने के लिए, चलाने

g++ source.cpp 

यह आदेश source.cpp संकलन होगा एक ही निर्देशिका में a.out दायर करने के लिए । g++ source2.cpp साथ संकलित फ़ाइल चलाने के लिए,

./a.out 

चलाने यदि आप किसी अन्य स्रोत फ़ाइल संकलन हैं, तो, नए संकलित फ़ाइल a.out के ऊपर लिख देगा आप एक विशिष्ट करने के लिए source.cpp संकलित करने के लिए चाहते हैं source.cpp

साथ a.out उत्पन्न फ़ाइल, compiledfile कहते हैं, रन

g++ source.cpp -o compiledfile 

या

g++ -o compiledfile source.cpp 

यह compiledfile जो संकलित बाइनरी फ़ाइल है पैदा करेगा। compiledfile को चलाने के लिए,

./compiledfile 

चलाते हैं g++ अपने $PATH में नहीं है, /usr/bin/g++ साथ ++ जी की जगह।

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