2013-05-27 8 views
8

मैंने अपनी उबंटू 13.04 मशीन पर क्लैंग 3.2 स्थापित किया है, और संकलित और libC++ बनाया है, और सब कुछ जगह में है। हालांकि, जब मैं अपने (वास्तव में सरल) कोड को जोड़ने का प्रयास करता हूं, तो लिंकर रिपोर्ट करता है कि std :: cout आदि के संदर्भ अपरिभाषित हैं।क्लैंग ++ 3.2 लिंकर सी ++ stdlib नहीं ढूंढ रहा

यदि कोई मुझे सलाह दे सकता है कि मैं इसे हल करने के लिए क्या कर सकता हूं, तो मैं बहुत आभारी हूं - मैंने जो भी सोच लिया है, मैंने कोशिश की है।

आदेश और उत्पादन यहां हैं:

$ clang++ -v -stdlib=libc++ -lpthread -ldl sqlite3/sqlite3.o src/world.o -o bin/world 

Ubuntu clang version 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2) 

Target: x86_64-pc-linux-gnu 

Thread model: posix 

"/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o bin/world /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../.. -L/lib -L/usr/lib -lpthread -ldl sqlite3/sqlite3.o src/world.o -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o 

src/world.o: In function `main': 

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: undefined reference to `std::cout' 

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: 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*)' 

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: 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*)' 

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: 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*)' 

src/world.o: In function `__cxx_global_var_init': 

/usr/include/c++/4.7.3/iostream:74: undefined reference to `std::ios_base::Init::Init()' 

/usr/include/c++/4.7.3/iostream:74: undefined reference to `std::ios_base::Init::~Init()' 

clang: error: linker command failed with exit code 1 (use -v to see invocation) 

make: *** [bin/world] Error 1 

उत्तर

4

त्रुटियों जीसीसी के libstdC++ world.o का संकेत -stdlib=libstdc++ साथ बनाया गया था से हेडर और प्रतीकों को दिखाने लेकिन आप -stdlib=libc++ जो असंगत है के साथ लिंक कर रहे हैं।

आपको लगातार -stdlib विकल्प का उपयोग करने की आवश्यकता है।

+0

दिलचस्प, चीयर्स। दुनिया को संकलित करने का आदेश। इस प्रकार इसका सही उपयोग करता है, जैसे: 'clang ++ -v -stdlib = libC++ -lpthread -ldl sqlite3/sqlite3.o src/world.o -o bin/world' हालांकि फ़ाइल sqlite3.o कि यह इसके खिलाफ जुड़ा हुआ है 'clang -c -o sqlite3/sqlite3.o sqlite3/sqlite3.c' के साथ संकलित है, क्योंकि यह एक सी फ़ाइल है। क्या यह इस मुद्दे से संबंधित हो सकता है? – biot023

+0

+1 क्योंकि यह मेरी समस्या भी हल करता है। लेकिन आप (या कोई भी) त्रुटि संदेशों से कैसे बता सकते हैं कि संकलन और लिंकिंग विभिन्न शीर्षलेख/पुस्तकालयों का उपयोग करके किया गया था? – Arbalest

+1

@अर्बलस्ट, क्योंकि मुझे पता है कि '/ usr/include/C++/4.7.3/iostream' एक हेडर का पथ है जो libसीसीd ++ के साथ GCC 4.7.3 से आता है, और यदि कोड में परिभाषित कुछ का संदर्भ है libstdC++ हेडर तो इसे libstdC++ का उपयोग करके संकलित किया जाना चाहिए, लेकिन लिंकर कमांड '-std = libC++' दिखाता है। –

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