2012-01-21 16 views
7

पर उद्देश्य उद्देश्य-सी अनुप्रयोग मैं एक उद्देश्य सी डेस्कटॉप संस्करण बनाने के लिए एक्सकोड का उपयोग करने की कोशिश कर रहा हूं जो स्थिर सी ++ लाइब्रेरी के खिलाफ लिंक करता है। मैं ऐप्पल के क्लैंग कंपाइलर का उपयोग कर रहा हूं। मैं निम्नलिखित लिंकर त्रुटि हो रही है:सी ++ स्थिर पुस्तकालय

Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn) 
Target: x86_64-apple-darwin11.2.0 
Thread model: posix 
"/Developer/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.7.0 -syslibroot /Developer/SDKs/MacOSX10.7.sdk -o /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug/sl marketplace analyitics.app/Contents/MacOS/sl marketplace analyitics -lcrt1.10.6.o -L/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -L/Users/andrew/Projects/sl-marketplace-analysis/platform/mac/sl marketplace analyitics/../../../../../Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug -filelist /Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Intermediates/sl marketplace analyitics.build/Debug/sl marketplace analyitics.build/Objects-normal/x86_64/sl marketplace analyitics.LinkFileList -framework Cocoa -lcore -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a -F/Users/andrew/Library/Developer/Xcode/DerivedData/sl-marketplace-analysis-exomzzahbygseghhwoeclcvpooeo/Build/Products/Debug 
Undefined symbols for architecture x86_64: 
    "std::ios_base::Init::~Init()", referenced from: 
     ___cxx_global_var_init in libcore.a(test.o) 
    "std::ios_base::Init::Init()", referenced from: 
     ___cxx_global_var_init in libcore.a(test.o) 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

ऐसा लगता है जैसे कि यह सी ++ एसटीडी पुस्तकालय रूप से लिंक हो नहीं है। क्या यह समस्या है और यदि हां, तो मैं कैसे सुनिश्चित करूं कि यह इसके खिलाफ जुड़ा हुआ है?

अद्यतन:

मैं निर्माण करने के लिए एक खाली cpp फ़ाइल जोड़ने तो सब कुछ संकलित करता है तथा ठीक चलाता है। मुझे लगता है कि लिंकर को सी ++ एसडीडी लाइब्रेरी के खिलाफ लिंक करने के लिए एक तरीका चाहिए। मैंने एक्सकोड में सभी बिल्ड सेटिंग्स को देखने का प्रयास किया है लेकिन ऐसा कुछ भी नहीं ढूंढ रहा है जो मदद करता है।

उत्तर

17

कोशिश जोड़ने -lstdC++ या -lC++ (निर्भर करता है जिस पर सी ++ रनटाइम अपने स्थिर पुस्तकालय उम्मीद) "अन्य लिंकर झंडे" से "की स्थापना का निर्माण" के अंतर्गत:

enter image description here

+0

मुझे एक ही समस्या का सामना करना पड़ा और पूरे दिन इस समाधान की तलाश में था इसे साझा करने के लिए धन्यवाद, एक आकर्षण की तरह काम करता है –

+1

धन्यवाद !!! मैं हे डी एक स्थैतिक पुस्तकालय जो उद्देश्य-सी, सी ++, और उद्देश्य-सी ++ का संयोजन था।लाइब्रेरी में बिल्डिंग के दौरान इस ध्वज को शामिल नहीं किया गया है, लेकिन मेरे आईओएस एप्लिकेशन में लाइब्रेरी का उपयोग करते समय किसी कारण से जरूरी है। मुझे कोई जानकारी नहीं है की क्यों। – jocull

+0

@jocull: जब आप एक स्थिर लाइब्रेरी बनाते हैं तो परिणामी फाइलें लिंक नहीं होती हैं, इसलिए अंतिम एप्लिकेशन के हिस्से के रूप में संग्रह को लिंक किए जाने तक पुस्तकालयों की आवश्यकता नहीं होती है। –

1

यह अजीब लगता है कि libcore.astd::ios_base नाम स्थान में Init नाम के एक वर्ग के लिए लग रही है। मुझे नहीं लगता कि std::ios_base::Init एक मानक वर्ग है।

इसके अलावा, आप यह जांचना चाहेंगे कि libcore.a में वास्तव में x86_64 कोड शामिल है। आप चेक करने के लिए file कमांड का उपयोग कर सकते हैं। उदाहरण के लिए:

$ file /usr/lib/libz.dylib 
/usr/lib/libz.dylib: Mach-O universal binary with 2 architectures 
/usr/lib/libz.dylib (for architecture x86_64): Mach-O 64-bit dynamically linked shared library x86_64 
/usr/lib/libz.dylib (for architecture i386): Mach-O dynamically linked shared library i386 

file आदेश उत्पादन एक "for architecture x86_64" लाइन शामिल नहीं है, तो आप पुस्तकालय एक 64-बिट निष्पादन योग्य बनाने के लिए उपयोग नहीं कर सकते।

+0

मेरे पास उस लाइब्रेरी का भी नियंत्रण है (मैं इसे उसी एक्सकोड वर्कस्पेस के भीतर बना रहा हूं। यह x86_64 के साथ बनाया गया है। – drewag

-1

अन्य लिंकर झंडे -lstdC++ Xcode5 में मेरे लिए मदद नहीं की। लेकिन एप्पल LLVM 5.0 में इसी तरह की बात का पता लगाना - Lnaguage - सी ++

डिफ़ॉल्ट सेटिंग libC++ (LLVM सी ++ मानक ~ blabla) था और अब ++ (जीएनयू बात)

libstdc में बदल जोड़ने के साथ कोई त्रुटि नहीं है !!! और अब मुझे यह पता लगाना है कि यह ठीक है।

वैसे भी सलाह के लिए धन्यवाद।

+0

वही समस्या - -lstdC++ का एक्सकोड 5 में कोई प्रभाव नहीं पड़ता है। इस उत्तर में सुझाए गए फ़िक्स का कोई प्रभाव नहीं है (और नहीं होना चाहिए) – Adam

+0

हाँ, यदि आप libC++ का उपयोग करते हैं, तो आपको libC++ के विरुद्ध लिंक करना चाहिए। यदि आप libstdC++ का उपयोग करते हैं (जो पुराना और बहिष्कृत है, तो नहीं), आपको libstdC++ के विरुद्ध लिंक करना चाहिए। –

2

Xcode 6 के साथ एक ही समस्या हो रही, मैं इसे जोड़ने के द्वारा में "लिंक बाइनरी पुस्तकालय के साथ" समाधान कर लिया है "libstdC++। 6.0.9.dylib" चरण & जोड़ने -lstdC++ करने के लिए "अन्य निर्माण लिंकर झंडे "बिल्ड सेटिंग

+0

धन्यवाद उर्मि, इसने मेरी समस्याओं का समाधान किया है, हालांकि मुझे "अन्य लिंकर ध्वज" में -lstdC++ जोड़ने की आवश्यकता नहीं है। मेरे मामले में, एप्लिकेशन लक्ष्य स्वयं शुद्ध ओबीजे-सी है और सी ++, न तो भाषा और न ही मानक पुस्तकालयों की आवश्यकता नहीं है। हालांकि, मुझे बाहरी तृतीय-पक्ष स्थिर पुस्तकालयों के खिलाफ लिंक करने की आवश्यकता है जो सी ++ का भारी उपयोग करते हैं (उदाहरण के लिए हमने खरीदा एक ऑडियो/वीडियो इंजन)। चूंकि वे स्थैतिक libs हैं, हमें हमारे ऐप में C++ मानक libs जोड़कर "उनकी सहायता" करनी होगी। किसी कारण से एक्सकोड स्वचालित रूप से ऐसा नहीं करता है। –

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