आम तौर पर इस तरह की विफलता तब होती है जब सी सी ++ कोड को सी फ्रंट-एंड का आह्वान करके संकलित किया जाता है। 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 - कोई लिंक त्रुटियों।
यह एक लिंकर समस्या है। आप कैसे जुड़ रहे हैं –
मैं सीपीपी के लिए नया हूं, मैं वास्तव में आपके प्रश्न को समझ नहीं पा रहा हूं। : –
संकलन और लिंक करने के लिए आप किस निर्देश का उपयोग करते थे? क्या कंपाइलर? –