2010-05-17 21 views
10

में एक उद्देश्य-सी ++ स्टेटिक लाइब्रेरी बनाना इसलिए मैंने आईफोन के लिए एक इंजन विकसित किया है जिसके साथ मैं कुछ अलग-अलग गेम बनाना चाहता हूं। प्रत्येक गेम की प्रोजेक्ट निर्देशिका के अंदर इंजन के लिए फाइलों की प्रतिलिपि बनाने और चिपकाने के बजाय, मैं प्रत्येक गेम से इंजन से लिंक करने का एक तरीका चाहता हूं, इसलिए यदि मुझे इसमें बदलाव करने की ज़रूरत है तो मुझे केवल एक बार ऐसा करना होगा। थोड़ी देर के आसपास रीडिंग के बाद, ऐसा लगता है कि आईफोन पर ऐसा करने के लिए स्थिर पुस्तकालय सबसे अच्छा तरीका है।एक्सकोड

मैंने स्केलेटन नामक एक नई परियोजना बनाई और मेरी सभी इंजन फ़ाइलों को कॉपी किया। मैंने एक स्थिर पुस्तकालय बनाने के लिए this मार्गदर्शिका का उपयोग किया, और मैंने लाइब्रेरी को चोज़र नामक प्रोजेक्ट में आयात किया। हालांकि, जब मैंने प्रोजेक्ट को संकलित करने का प्रयास किया, तो एक्सकोड ने कुछ सी ++ डेटा संरचनाओं के बारे में शिकायत करना शुरू किया जिसे मैंने ControlScene.mm नामक फ़ाइल में शामिल किया था। यहाँ अपने निर्माण त्रुटियों है:

"operator delete(void*)", referenced from: 


     -[ControlScene dealloc] in libSkeleton.a(ControlScene.o) 


     -[ControlScene init] in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::deallocate(operation_t*, unsigned long)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t*>::deallocate(operation_t**, unsigned long)in libSkeleton.a(ControlScene.o) 


    "operator new(unsigned long)", referenced from: 


     -[ControlScene init] in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t*>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


    "std::__throw_bad_alloc()", referenced from: 


     __gnu_cxx::new_allocator<operation_t*>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


     __gnu_cxx::new_allocator<operation_t>::allocate(unsigned long, void const*)in libSkeleton.a(ControlScene.o) 


    "___cxa_rethrow", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


    "___cxa_end_catch", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


    "___gxx_personality_v0", referenced from: 


     ___gxx_personality_v0$non_lazy_ptr in libSkeleton.a(ControlScene.o) 


     ___gxx_personality_v0$non_lazy_ptr in libSkeleton.a(MenuLayer.o) 


    "___cxa_begin_catch", referenced from: 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_create_nodes(operation_t**, operation_t**)in libSkeleton.a(ControlScene.o) 


     std::_Deque_base<operation_t, std::allocator<operation_t> >::_M_initialize_map(unsigned long)in libSkeleton.a(ControlScene.o) 


ld: symbol(s) not found 


collect2: ld returned 1 exit status 

किसी को भी क्यों इन समस्याओं को उत्पन्न कर रहे हैं के रूप में कुछ जानकारी प्रदान कर सकते हैं, मैं यह सराहनीय होगा।

उत्तर

17

समस्या यह है कि आपकी लाइब्रेरी गतिशील रूप से libstdC++ के खिलाफ लिंक कर रही है। इसे ठीक करने के तरीके के रूप में, आपको अपनी लाइब्रेरी बनाने के दौरान विभिन्न संयोजनों में "-स्टैटिक-libstdC++", और "-static-libgcc" का प्रयास करना चाहिए (सुनिश्चित नहीं है कि उनमें से किसकी आवश्यकता है, लेकिन इसके कुछ संयोजन चाहिए इसे पूरी तरह स्थैतिक बनाओ)।

संपादित
खैर, यह पता चला है कि आप गतिशील रूप से iPhone पर ++ libstdc के खिलाफ से जोड़ने के लिए है, तो वास्तव में एक बेहतर समाधान बस डाल करने के लिए "-lstdC++" में (अर्थात, स्पष्ट रूप से libstdc के खिलाफ लिंक ++) की अनुमति है आपके निर्माण में

+0

ये कहां स्थित हैं? – LandonSchropp

+0

@helixed, यदि आप मेकफ़ाइल या कमांडलाइन से लाइब्रेरी बनाते हैं, तो आप उन्हें g ++ के अपने आमंत्रण में जोड़ सकते हैं। यदि आप एक्सकोड का उपयोग कर रहे हैं, तो मेरा मानना ​​है कि आपके प्रोजेक्ट बिल्ड सेटिंग्स में "अन्य झंडे" जैसे कुछ हैं जहां आप इन्हें टाइप कर सकते हैं। –

+1

यूप, पूरी तरह से काम किया। यदि कोई सोच रहा था तो सेटिंग को अन्य लिंकर झंडे लगाने के लिए सही स्थान सेटिंग है। सहायता के लिए धन्यवाद। – LandonSchropp

1

मैंने चयनकर्ता के लिए बिल्ड सेटिंग्स में जाकर समस्या का समाधान किया, "संकलन स्रोत के रूप में" खोजना और उद्देश्य-सी ++ का चयन करना। यह शायद एक गंदे समाधान है, लेकिन यह काम किया।

+0

यह काम करता है क्योंकि यह अब libstdC++ के खिलाफ जुड़ा हुआ है। –

+0

क्या इसका मतलब यह है कि यह प्रभावी रूप से -lstdC++ ध्वज जोड़ने जैसा ही काम करता है? –

24

अन्य लिंकर झंडे

+0

यह मेरे लिए काम किया। – Manali

+0

ग्रेट !! .... +1 – TheTiger

1

जब एक .framework लिंक करने का प्रयास मैं इस मुद्दे में भाग पर सेट करें "-lstdC++"। मैं स्रोत के रूप में एक खालीcppstub.mm फ़ाइल (Compile Sources चरण के लिए)

मुझे लगता है कि यह सी ++ संकलन के कुछ प्रकार के लिए मजबूर किया जाना चाहिए जब आप ऐसा करते हैं, मुझे मत पूछो क्यों

जोड़कर इसे ठीक करने प्रबंधित किया है