La création d'un Objectif-C++ Statique de la Bibliothèque dans Xcode
J'ai donc développé un moteur pour l'iPhone avec lequel je voudrais construire un couple de différents jeux. Plutôt que de copier et coller les fichiers du moteur à l'intérieur de chaque partie du répertoire du projet, j'avais un moyen de lien vers le moteur de chaque jeu, donc si j'ai besoin de faire un changement pour elle je n'ai qu'à le faire une fois. Après reeding autour d'un peu, il semble que les bibliothèques statiques sont la meilleure façon de le faire sur l'iPhone.
J'ai créé un nouveau projet appelé Squelette et copié tous mes fichiers du moteur. J'ai utilisé cette guide pour créer une bibliothèque statique, et j'ai importé la librairie dans un projet appelé Sélecteur de champs. Cependant, lorsque j'ai essayé de compiler le projet, Xcode, a commencé à se plaindre au sujet de certains C++ structures de données que j'ai mis dans un fichier appelé ControlScene.mm. Voici mes erreurs de build:
"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
Si quelqu'un pourrait offrir de mieux comprendre les raisons de ces problèmes se produisent, je l'apprécierais.
OriginalL'auteur LandonSchropp | 2010-05-17
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que votre bibliothèque est dynamiquement liaison contre libstdc++. Quant à la façon de résoudre ce problème, vous devriez essayer "statique", "-statique-libstdc++", et "-static-libgcc" dans diverses combinaisons lors de la construction de votre bibliothèque (je ne sais pas lequel d'entre eux sont nécessaires, mais une combinaison de ceux-ci devrait rendre totalement statique).
Modifier
Eh bien, il s'avère que vous êtes autorisé à lier dynamiquement contre libstdc++ sur l'iPhone, donc, en fait, une meilleure solution est de simplement mettre "-lstdc++" (qui est, de lien explicite entre l'encontre de libstdc++) dans votre construction.
si vous la construction de la bibliothèque avec un Makefile ou à partir de la ligne de commande, vous pouvez les ajouter à votre invocation de g++. Si vous êtes en utilisant Xcode, je crois qu'il existe quelque chose comme "les autres drapeaux" dans votre projet de construction paramètres, où vous pouvez taper ces dans.
Yup, a parfaitement fonctionné. Le paramètre bon endroit pour mettre il en est d'autres drapeaux de l'éditeur de liens dans le cas où quelqu'un a été vous demandez-vous. Merci pour l'aide.
Je dois ajouter ce drapeau de l'application qui utilise la bibliothèque statique, pas à la bibliothèque elle-même. Est-il possible de construire la bibliothèque, de telle sorte qu'il n'est pas nécessaire de modifier les paramètres de génération de l'application?
OriginalL'auteur
Définir le "-lstdc++" à d'Autres Drapeaux de l'éditeur de liens
Génial!! .... +1
OriginalL'auteur
J'ai résolu le problème en allant dans les paramètres de construction pour le Sélecteur, la recherche de la "Compilation de la Source" et en sélectionnant Objective-C++. C'est probablement une solution sale, mais cela a fonctionné.
Est-ce à dire que effectivement cela fait la même chose que l'ajout de l'-lstdc++ drapeau?
OriginalL'auteur
J'ai rencontré ce problème lorsque vous essayez de lier un .cadre. J'ai réussi à le résoudre par l'ajout d'une vide
cppstub.mm
fichier source (àCompile Sources
phase)Je suppose qu'il doit être obligeant certains sorte de compilation C++ lorsque vous faites cela, ne me demandez pas pourquoi
OriginalL'auteur