Erstellen eines Ziel-C++ Static Library in Xcode
Also habe ich entwickelt, eine engine für das iPhone, mit dem würde ich gern ein paar verschiedene Spiele. Anstatt kopieren und einfügen die Dateien für die engine in jeder Spiel-Projekt, directory, würde ich eine Weise zu verknüpfen, um den Motor vor jedem Spiel, also wenn ich brauche, um eine Veränderung an, die ich nur so einmal. Nach reeding ein wenig herum, wie es scheint, statische Bibliotheken sind der beste Weg, dies zu tun auf dem iPhone.
Erstellte ich ein neues Projekt namens Skelett und kopiert alle meine engine-Dateien. Ich verwendet diese Anleitung zum erstellen einer statischen Bibliothek verwendet wird, und ich importierte die Bibliothek in ein Projekt namens Auswahl. Allerdings, wenn ich versuchte, das Projekt zu kompilieren, Xcode gestartet beschweren sich über einige C++ - Datenstrukturen, die ich in einer Datei namens ControlScene.mm. Hier ist mein build-Fehler:
"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
Könnte jemand einen Einblick, warum diese Probleme auftreten, würde ich es begrüßen.
InformationsquelleAutor LandonSchropp | 2010-05-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass Ihre Bibliothek dynamisch verknüpfen gegen die libstdc++. Wie um es zu beheben, sollten Sie versuchen, "statisch", "-static-libstdc++" und "-static-libgcc" in verschiedenen Kombinationen beim Bau der Bibliothek (nicht sicher, welche von Ihnen benötigt werden, aber eine Kombination davon machen sollte, es voll statisch).
Bearbeiten
Nun, es stellt sich heraus, dass Sie berechtigt sind, dynamisch zu verknüpfen, die gegen die libstdc++ auf dem iPhone, so dass es eigentlich eine bessere Lösung ist, einfach gesagt "-lstdc++" (d.h. explizit-link gegen die libstdc++) in deinem build.
wenn Sie bauen die Bibliothek mit einem Makefile oder von der Kommandozeile, können Sie fügen Sie Sie zu Ihrem Aufruf von g++. Wenn Sie mit Xcode, ich glaube, es gibt so etwas wie "other flags" im Projekt-build-Einstellungen, wo Sie können, geben Sie diese in.
Yup, funktioniert perfekt. Die Einstellung, die richtige Stelle zu setzen, es gibt andere linker flags falls jemand eine Frage war. Vielen Dank für die Hilfe.
Ich muss hinzufügen, dieses flag, um die Anwendung, die die statische Bibliothek, nicht die Bibliothek selbst. Ist es möglich, den Bau der Bibliothek in einer Weise, dass es ist nicht notwendig, ändern Sie die build-Einstellungen von der app?
InformationsquelleAutor Michael Aaron Safyan
Set "-lstdc++" Anderer Linker Flags
Super!!!! .... +1
InformationsquelleAutor dale
Habe das problem behoben, indem Sie in den build-Einstellungen zur Auswahl, auf der Suche nach "Compile Source" und wählen Objective-C++. Dies ist wahrscheinlich eine schmutzige Lösung, aber es funktionierte.
Bedeutet das, dass diese effektiv macht das gleiche wie mit der Option-lstdc++ - flag?
InformationsquelleAutor LandonSchropp
Ich lief in dieses Problem, wenn Sie versuchen, zu verknüpfen .Rahmen. Ich habe es geschafft, es zu beheben, indem ein leer
cppstub.mm
- Datei als Quelle (Compile Sources
phase)Ich denke, es muss zwingen eine Art von C++ - Kompilierung wenn Sie dies tun, Fragen Sie mich nicht, warum
InformationsquelleAutor Ege Akpinar