2012-08-07 12 views
23

सभी के लिए अनिर्धारित प्रतीक फेंकता है, मैं अपने मैक ओएस एक्स 10.8 में इस तरह का एक कोड लिखता हूं, और जब मैं इसे संकलित करने के लिए "gcc use_new.cpp -o use_new" का उपयोग करता हूं है, लेकिन यह इस तरह गलत संदेश फेंकता है:मैक ओएस एक्स 10.8 पर जीसीसी 4.8 "आर्किटेक्चर x86_64:"

Undefined symbols for architecture x86_64: 
    "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> >&))", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(void const*)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(double)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >::operator<<(unsigned long)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o 
    "std::ios_base::Init::~Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o 
    "std::cout", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from: 
     _main in ccr2vrRQ.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from: 
     _main in ccr2vrRQ.o 
    "operator delete(void*)", referenced from: 
     _main in ccr2vrRQ.o 
    "operator new(unsigned long)", referenced from: 
     _main in ccr2vrRQ.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

और जब मैं का उपयोग करें "जी ++ use_new.cpp -ओ use_new" जो मेरी मदद कर सकते ठीक है, !? धन्यवाद!

#include <iostream>  
    struct fish    
    { 
     float weight; 
     int id; 
     int kind;    
    }; 
    int main()    
    { 
     using namespace std; 
     int* pt = new int;  
     *pt = 1001;    
     cout<<"int: "<<*pt<<"in location: "<<pt<<endl; 
     double* pd = new double; 
     *pd = 100000001.0;  
     cout<<"double: "<<*pd<<"in location: "<<pd<<endl; 
     cout<<"int point pt is length "<<sizeof(*pt)<<endl; 
     cout<<"double point pd is length "<<sizeof(*pd)<<endl; 
     delete pt;    
     delete pd;    
     cout<<(int *)"How are you!"<<endl; 
     return 0; 
    } 
+0

मुझे "हैलो वर्ल्ड" प्रोग्राम संकलित करने की कोशिश करते हुए 'i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1' के साथ एक ही समस्या है। बक्षीस शुरू किया। – Randomblue

+2

यह एक रूप में या किसी अन्य बार कई बार पूछा गया है (उदाहरण के लिए [यहां] (http://stackoverflow.com/questions/5590983/problem-occurred-while-compiling-a-cpp-program-in-gcc) , [यहां] (http://stackoverflow.com/questions/1221902/programs-compiles-in-g-but-exits-with-linker-errors-in-gcc?rq=1) या [यहां] (http: //stackoverflow.com/questions/8904722/gcc-linker-cant-find-standard-library))। आपको पढ़ने से लाभ होगा [जी ++ और जीसीसी के बीच क्या अंतर है?] (Http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc)। – Troubadour

उत्तर

5

इस stackoverflow सवाल का जवाब इस सवाल का जवाब

gcc and g++ linker

उपयोग

gcc -lstdc++ use_new.cpp -o use_new 

-lstdc++ झंडा लिंकर सी ++ स्टैंडर्ड लाइब्रेरी

शामिल करने के लिए कहता है है

मैं मैक ओएस एक्स 10.7.4 चल रहा हूँ और पुस्तकालय यहाँ

/usr/lib/libstdc++.dylib 
+0

धन्यवाद; यह काम करता है। क्या आप झंडे पर विस्तार से बता सकते हैं? – Randomblue

+0

यह लिंकर को सी ++ मानक लाइब्रेरी को शामिल करने के लिए कहता है, इसमें शामिल करने के लिए संपादित उत्तर। – amdn

66

यह यहां तक ​​कि पुराने 4.2 जीसीसी के साथ मामला है स्थित है (मैं यह अनुभव जब मैं अपने अनौपचारिक आईओएस toolchain की स्थापना)। gcc डिफ़ॉल्ट रूप से सी मानता है, और सी ++ मानक लाइब्रेरी से लिंक किए बिना लिंकर को आमंत्रित करता है; इसके विपरीत, g++ डिफ़ॉल्ट रूप से C++ मानक लाइब्रेरी के विरुद्ध C++ और लिंक मानता है।

कुल मिलाकर - संभव समाधान:

gcc myprog.c -o myprog -lstdc++ 

या

g++ myprog.c -o myprog 
+0

मैं देखता हूं। क्या आप जीसीसी के एक नवीनतम संस्करण का उपयोग करने की सलाह देंगे? – Randomblue

+0

@Randomblue जीसीसी का कोई और हालिया संस्करण नहीं है - यहां तक ​​कि 4.8 भी विकास में है। या तो जोड़ने के लिए '-lsdtC++' का उपयोग करें, या बेहतर (मैं आपको ऐसा करने की सलाह देता हूं): लिंक करने के लिए g ++ का उपयोग करें। –

+0

उपहार के लिए धन्यवाद। –

3

यह @ user1582840 सिर्फ मेरी 2 सेंट द्वारा चिपकाया कोड से संबंधित नहीं है, और का एक अलग कारण से मेरे कुछ कोड पर काम करते समय g ++ में एक ही समस्या:

मुझे "एलडी: प्रतीक" आर्किटेक्चर x86_64 "के लिए नहीं मिला है, ओएस एक्स 10.8/डार्विन 11 पर एक अलग के लिए g ++ 4.2.1 का उपयोग करते समय त्रुटि ent कारण उम्मीद है कि यह समस्या के लिए कुछ खोज Google की मदद करेगा।

मुझे यह त्रुटि मिली क्योंकि कक्षा परिभाषा में मैंने वर्ग परिभाषित किया था, मैंने सदस्यों के कार्यों की घोषणा की थी। हालांकि, जब मैंने सदस्य कार्यों को परिभाषित किया तो मैं कक्षा संशोधक को शामिल करना भूल गया।

class NewClass 
{ 
    NewClass(); // default constructor 
}; 

फिर बाद में, जब NewClass() निर्माता (या किसी भी सदस्य समारोह) को परिभाषित मैं बस था:

मैं क्या (कोड नमूना, नहीं पूरा कार्यक्रम) बात कर रहा हूँ का एक उदाहरण के लिए

तो :

// don't do this, it will throw that error!! 
NewClass() 
{ 
    // do whatever 
} 

बजाय:

// proper way 
NewClass::NewClass() 
{ 
    // do whatever 
} 

यह एक नहीं बल्कि साधारण गलती है, और मैं टी कामयाब ओ इसे सौभाग्य से थोड़े समय में पकड़ें, लेकिन किसी के लिए याद रखना आसान हो सकता है (विशेष रूप से नए लोग), और जीसीसी/जी ++ लिंकर्स, एक्सकोड इत्यादि के बारे में समाधान।इसके लिए कोई मदद नहीं है: पी

फिर, उम्मीद है कि यह मदद करता है!

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