2010-05-17 16 views
10

Also habe ich eine Engine für das iPhone entwickelt mit der ich ein paar verschiedene Spiele bauen möchte. Anstatt die Dateien für die Engine innerhalb des Projektverzeichnisses jedes Spiels zu kopieren und einzufügen, konnte ich von jedem Spiel aus eine Verbindung zur Engine herstellen. Wenn ich also eine Änderung vornehmen muss, muss ich das nur einmal tun. Nachdem Sie ein wenig herumgespielt haben, scheint es, als wären statische Bibliotheken der beste Weg, dies auf dem iPhone zu tun.Erstellen einer Objective-C++ statischen Bibliothek in Xcode

Ich habe ein neues Projekt namens Skeleton erstellt und alle meine Engine-Dateien kopiert. Ich habe this Guide verwendet, um eine statische Bibliothek zu erstellen, und ich importierte die Bibliothek in ein Projekt namens Chooser. Als ich jedoch versuchte, das Projekt zu kompilieren, begann Xcode sich über einige C++ - Datenstrukturen zu beschweren, die ich in eine Datei namens ControlScene.mm einfügte. Hier ist mein Buildfehler:

"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 

Wenn jemand einen Einblick bieten könnte, warum diese Probleme auftreten, würde ich es zu schätzen wissen.

Antwort

17

Das Problem ist, dass Ihre Bibliothek dynamisch gegen libstdC++ verlinkt. Um es zu reparieren, sollten Sie versuchen, "-static", "-static-libstdC++" und "-static-libgcc" in verschiedenen Kombinationen beim Erstellen Ihrer Bibliothek (nicht sicher, welche von ihnen benötigt werden, aber einige Kombination davon sollte mach es komplett statisch).

bearbeiten
Nun, es stellt sich heraus, dass Sie erlaubt sind dynamisch gegen libstdc verlinken auf ++ auf dem iPhone, also eigentlich eine bessere Lösung ist einfach zu setzen „-lstdC++“ in (das heißt, link explizit gegen libstdC++) in deinem Build.

+0

Wo befinden sich diese? – LandonSchropp

+0

@helixed, wenn Sie die Bibliothek mit einem Makefile oder von der Kommandozeile aus erstellen, können Sie diese zu Ihrem Aufruf von g ++ hinzufügen. Wenn Sie Xcode verwenden, glaube ich, dass es in Ihren Projekt-Build-Einstellungen so etwas wie "andere Flags" gibt, wo Sie diese eingeben können. –

+1

Yup, hat perfekt funktioniert. Der richtige Ort, um es zu setzen, sind andere Linker Flags, falls jemand sich fragen sollte. Danke für die Hilfe. – LandonSchropp

1

Ich habe das Problem behoben, indem ich in die Build-Einstellungen für Chooser gegangen bin, "Quelle kompilieren als" gesucht und Objective-C++ ausgewählt habe. Dies ist wahrscheinlich eine schmutzige Lösung, aber es hat funktioniert.

+0

es funktionierte, weil es jetzt gegen libstdC++ verbindet. –

+0

Bedeutet das, dass dies effektiv das gleiche wie das Hinzufügen des -lstdC++ Flags tut? –

24

Stellen Sie die „-lstdC++“ an andere Linker Flags

+0

Das hat bei mir funktioniert. – Manali

+0

Großartig !! .... +1 – TheTiger

1

ich in dieser Ausgabe lief, als ein .framework zu verbinden versuchen. Ich habe es geschafft, es zu beheben, indem sie ein leercppstub.mm Datei als Quelle Zugabe (zu Compile Sources Phase)

Ich denke, es muss irgendeine Art von C++ Kompilation werden zwingt, wenn Sie dies tun, fragen Sie mich nicht, warum

Verwandte Themen