2011-09-23 20 views
37

मैं ओएसएक्स शेर पर इस सीपीपी कोड को संकलित करने का प्रयास करता हूं लेकिन मुझे एक त्रुटि मिलती है।कुछ सरल सी ++ कोड संकलित करते समय त्रुटि

#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) 
{ 
    for(int i = 0; i < 10; i++) 
    { 
     cout << "hi"; 
     cout << endl; 
    } 

    return 0; 
} 

संकलन करने के लिए:

cc main.cpp 

त्रुटि:

Undefined symbols for architecture x86_64: 
    "std::cout", referenced from: 
     _main in ccBdbc76.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 ccBdbc76.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 ccBdbc76.o 
    "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 ccBdbc76.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccBdbc76.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in ccBdbc76.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
+4

यह एक लिंकर समस्या है। आप कैसे जुड़ रहे हैं –

+0

मैं सीपीपी के लिए नया हूं, मैं वास्तव में आपके प्रश्न को समझ नहीं पा रहा हूं। : –

+3

संकलन और लिंक करने के लिए आप किस निर्देश का उपयोग करते थे? क्या कंपाइलर? –

उत्तर

76

आम तौर पर इस तरह की विफलता तब होती है जब सी सी ++ कोड को सी फ्रंट-एंड का आह्वान करके संकलित किया जाता है। gcc आप निष्पादित करते हैं और फ़ाइल को C++ के रूप में संकलित करते हैं, लेकिन इसे C++ लाइब्रेरी से लिंक नहीं करते हैं। उदाहरण:

$ gcc example.cpp 
Undefined symbols for architecture x86_64: 
    "std::cout", referenced from: 
     _main in ccLTUBHJ.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 ccLTUBHJ.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 ccLTUBHJ.o 
    "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 ccLTUBHJ.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccLTUBHJ.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in ccLTUBHJ.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
$ g++ example.cpp 
$ 

आप देख सकते हैं, g++ प्रयोग करने में समस्या दूर जाना पड़ता है। समान व्यवहार (थोड़ा अलग संदेश के साथ) होती है, तो आप clang का उपयोग करें (जो मैं सलाह देते हैं):

$ clang example.cpp 
Undefined symbols for architecture x86_64: 
    "std::ios_base::Init::~Init()", referenced from: 
     ___cxx_global_var_init in cc-IeV9O1.o 
    "std::ios_base::Init::Init()", referenced from: 
     ___cxx_global_var_init in cc-IeV9O1.o 
    "std::cout", referenced from: 
     _main in cc-IeV9O1.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 cc-IeV9O1.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 cc-IeV9O1.o 
    "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from: 
     _main in cc-IeV9O1.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
$ clang++ example.cpp 
$ 

आप clang त्रुटि संदेश में देख सकते हैं, आप -v इस्तेमाल कर सकते हैं लिंकर मंगलाचरण देखने के लिए देखने के लिए क्या गलत हो रहा है यह आप इस लिंक लाइन दिखाएगा:

"/usr/bin/ld" -demangle -dynamic -arch x86_64 
    -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o 
    /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o 
    -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a 

या कुछ ऐसा - जैसा कि आप देख सकते हैं, यह सी क्रम लिंक कर रहा है, सी नहीं ++ और भी सी ++ पुस्तकालयों जरूरत नहीं है। लिंक लाइन clang++ का उपयोग करना है:

"/usr/bin/ld" -demangle -dynamic -arch x86_64 
    -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o 
    /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-wJwxjP.o 
    /usr/lib/libstdc++.6.dylib -lSystem 
    /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a 

आप देख सकते हैं, libstdc++ शामिल है, और Presto - कोई लिंक त्रुटियों।

+10

+1। –

+2

क्लैंग ++ का उपयोग कर काम किया। –

+2

ओह! मैं अपनी 'अन्य.c' फ़ाइल को' clang' कमांड फ़ाइल नाम तर्क में जोड़ना भूल गया। मैंने अभी 'clang main.c' किया था। 'Clang main.c अन्य.c' करना काम किया। (मेरे पास 'main.c'' के शीर्ष पर '# शामिल" है। – ma11hew28

3

मैं OSX शेर के साथ परिचित नहीं हूँ। हालांकि, सख्त अर्थ में, वर्णित त्रुटियां संकलक के कारण नहीं होती हैं, बल्कि लिंकर द्वारा होती हैं। ऐसा लगता है जैसे मानक पुस्तकालय जुड़ा नहीं जा रहा है।

3

सी ++ संकलित करने और मानक सी ++ लाइब्रेरी से लिंक करने के लिए सीसी कमांड (अपरकेस) का उपयोग करें।

0

क्या यह जीसीसी विंडोज (मिनजीडब्लू) या लिनक्स पर है? MinGW पर आपको पैरामीटर -lmingw32 -enable-auto-import की आवश्यकता है। लिनक्स को कुछ समान की आवश्यकता हो सकती है, -enable-auto-import सबसे अधिक आवश्यक है।

+0

ओपी का सवाल 'ओएसएक्स शेर' कहता है। –

+0

स्पष्ट रूप से मैं पढ़ नहीं सकता -_- – Frigo

5

प्रयास करें

g++ main.cpp 

इस तरह यह काम करना चाहिए, कम से कम ओएस एक्स

1

का उपयोग कर Yosemite (10.10.1) के रूप में, मैं पाया है कि gcc-lc++ ध्वज के साथ भी काम करता है:

gcc -lc++ main.cpp 
0

हैं ओएस एक्स पर बजना का उपयोग कर, की कोशिश:

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out 

मानक सी ++ ओएस एक्स पर उपलब्ध पुस्तकालय के दो कार्यान्वयन कर रहे हैं: libstdC++ और libC++

1

यहाँ समाधान है कि MacOS सिएरा पर काम करता है। वे बाइनरी संगत नहीं हैं और libMLi3 libstdC++ की आवश्यकता है।

10 पर।8 और पहले libstdC++ डिफ़ॉल्ट रूप से चुना जाता है, 10.9 libC++ पर डिफ़ॉल्ट रूप से चुना जाता है। LibMLi3 के साथ संगतता सुनिश्चित करने के लिए, हमें libstdC++ मैन्युअल रूप से चुनने की आवश्यकता है।

ऐसा करने के लिए, जोड़ने-आदेश में add -stdlib = libstdC++ जोड़ें।

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